[C#] Berekening op stukje uit XML-bestand en overschrijven.

Status
Niet open voor verdere reacties.

robert101083

Nieuwe gebruiker
Lid geworden
25 jan 2015
Berichten
2
Ik heb een stuk XML, dit komt uit een applicatie dus ik kan niets doen aan de opmaak. Ik wil de attributen uitlezen, een berekening toepassen en daarna de uitkomt, de huidige waarden laten overschrijven.

De waarden in elke LineTo-rij vormen de coordinaten van de hoekpunten van een rechthoek, ik moet een bekerening toepassen op de gehele rechthoek, de nieuwe coordinaten terugschrijven naar de XML.
Voor de berekening heb ik dus de waarden nodig van meerdere attributen tegelijk. Dus een waarde van bijvoorbeeld de eerste X + 5 en weer opslaan gaat niet.

Het aantal MoveTo met de bijbehorende 4 LineTo nodes kan varrieren. In dit voorbeeld staan de coordinaten van 2 rechthoeken, dus kunnen er bijvoorbeeld ook 1 of 3 zijn.

In het laatste CODE-blok zien jullie dat ik de XML uitlees en via de switch de type regels kan onderscheiden in MoveTo en LineTo. Zodra ik 1 x een MoveTo heb, kan ik wel nog 4 x door de loop gaan en de LineTo waarden (als double) ophalen. De berekening op alles toepassen, een nieuwe stuk text maken in de vorm van een string die er dat uitziet als het huidige stuk XML maar dan met de nieuwe coordinaten.

Hiermee sla ik natuurlijk helemaal de plank mis, wanneer ik dit in een string doe. Hoe kan ik dit het beste aanpakken? En hoe vervang ik dan de oude Outline Node in mijn bestand met de nieuwe?

(De berekening zelf is verder geen probleem.)

Code:
<Outline>
	<MoveTo X="1344.64" Y="2576.58"/>
	<LineTo X="1344.64" Y="1299.01"/>
	<LineTo X="11.43" Y="1299.01"/>
	<LineTo X="11.43" Y="2576.58"/>
	<LineTo X="1344.64" Y="2576.58"/>
	<MoveTo X="1344.64" Y="1289.01"/>
	<LineTo X="1344.64" Y="11.43"/>
	<LineTo X="11.43" Y="11.43"/>
	<LineTo X="11.43" Y="1289.01"/>
	<LineTo X="1344.64" Y="1289.01"/>
	<Method Type="Thru-cut"/>
</Outline>

Dit haal ik netjes op via:
Code:
            string fileName = @"..\..\..\..\test.zcc";

            xmlDoc.Load(fileName);

            XmlNodeList outlineNodes = xmlDoc.SelectNodes("/ZCC_cmd/Job/Geometry/Outline/*");

            foreach (XmlNode outlineNode in outlineNodes)
            {
                nodeName = outlineNode.Name;
                
                if (outlineNode.Name != "Method")
                {
                    x = Convert.ToDouble(outlineNode.Attributes["X"].Value);
                    y = Convert.ToDouble(outlineNode.Attributes["Y"].Value);
                    Console.WriteLine("nodeName.Name: " + nodeName + " X: " + x + " Y: " + y);
                }

                switch (nodeName)
                {
                    case "MoveTo":

                        // Doe iets
                        break;
                    case "LineTo":

                        // Doe iets
                        break;
                    default:
                        break;
                }

            }
}
 
Er zijn veel oplossingen te bedenken. Wat is er mis met gewoon de nodes lezen, wissen en later weer toevoegen?
 
Er zijn veel oplossingen te bedenken. Wat is er mis met gewoon de nodes lezen, wissen en later weer toevoegen?

Nou, ik dacht dat het misschien beter zou zijn om met XML-objecten te werken dan met een string. Ik weet alleen niet welke. Ook omdat de opmaak, volgens mij, van het deel XML waar het hier om gaat ook niet echt netjes is opgemaakt. In de node <Outline> staan nu verschillende outline achter elkaar. Volgens mij was het netter geweest als het was als volgd:

Code:
<Outlines>
    <Outline>
        <MoveTo X="1344.64" Y="2576.58"/>
        <LineTo X="1344.64" Y="1299.01"/>
        <LineTo X="11.43" Y="1299.01"/>
        <LineTo X="11.43" Y="2576.58"/>
        <LineTo X="1344.64" Y="2576.58"/>
    </Outline>
    <Outline>
        ...
    </Outline>
    <Method Type="Thru-cut"/>
</Outlines>
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan