Fragensteller
LINQ XML Parent/Child "Liste" auslesen

Frage
-
Hallo Zusammen,
Ich habe eine XML indem in einem ChildElement eine Liste ist. Und ich möchte gerne auf die einzelnen Elemente zugreifen können.
Die XML sieht so aus:
<?xml version="1.0" encoding="ISO-8859-15" standalone="yes" ?> <lol> <ag> <aktion>ZUW</aktion> <ag> <Auftrag> <Daten></Daten> <Daten1>1</Daten1> <Daten2>2</Daten2> <Daten3>3</Daten3> <Daten4>4</Daten4> <Daten5>5</Daten5> <Daten6>6</Daten6> <Child1> <ChildDaten1>C1</ChildDaten1> <ChildDaten2>C2</ChildDaten2> <ChildDaten3>C3</ChildDaten3> <ChildDaten4>C4</ChildDaten4> </Child1> <Daten7>7</Daten7> <Child2> <GrandChild> <GrandChildDaten>GC1</GrandChildDaten> <GrandChildDaten>GC2</GrandChildDaten> </GrandChild> <GrandChild> <GrandChildDaten>GC11</GrandChildDaten> <GrandChildDaten>GC22</GrandChildDaten> </GrandChild> </Child2> </Auftrag> </lol>
In dem Programm wird die XML erst geöffnet, die Struktur ausgelesen(Die Parent/Child Elemente). Dann wird über eine While schleife auf jedes Element zugegriffen:
Hier der Code:
private void button2_Click(object sender, EventArgs e) { int i = 0; int u = xmlarray.Length; string xmldes=""; XDocument xmlDoc = XDocument.Load(@"c:\b.xml"); var simpleQuery = (from Auftrag in xmlDoc.Descendants("iAuftrag") select Auftrag).FirstOrDefault(); string aktion = simpleQuery.Element("aktion").Value; string zuw = "ZUW"; if (zuw.Equals(aktion)) { while (i < u) { string[] getrennt = xmlarray[i].Split('.'); int counter = getrennt.GetLength(0); if (counter == 5) { XDocument xmlDoc2 = XDocument.Load("c:\\a.xml"); var simpleQuery2 = (from Auftrag in xmlDoc2.Descendants(getrennt[0]).Descendants(getrennt[1]).Descendants(getrennt[2]).Descendants(getrennt[3]) select Auftrag).FirstOrDefault(); xmldes = xmldes + simpleQuery2.Element(getrennt[4]).Value + "\r\n"; } else if (counter == 4) { XDocument xmlDoc2 = XDocument.Load("c:\\a.xml"); var simpleQuery2 = (from Auftrag in xmlDoc2.Descendants(getrennt[0]).Descendants(getrennt[1]).Descendants(getrennt[2]) select Auftrag).FirstOrDefault(); xmldes = xmldes + simpleQuery2.Element(getrennt[3]).Value + "\r\n"; } else if (counter == 3) { .. } else if (counter == 2) { .. } i++; } textBox1.Text = xmldes; } }
Das Ergebnis was ich erhalte ist das hier:
ZUW ZUW 123456C1C2C3C47GC1GC2GC11GC22 1 2 3 4 5 6 C1C2C3C4 C1 C2 C3 C4 7 GC1GC2GC11GC22 GC1GC2 GC1 GC1 GC1GC2 //<<- Falsch Sollte sein: GC11GC22 GC1 //<<- Falsch Sollte sein: GC11 GC1 //<<- Falsch Sollte sein: GC22
Wie im kommentieren bereich zu sehen ist, hätte ich gerne das Ergebnis.
Hat jemand einen Tipp was ich da machen kann ?
gruß
mtotm
Alle Antworten
-
In XMLarray ist die Struktur der Elemente in der XML gespeichert.
lol lol.iAuftrag lol.iAuftrag.aktion lol.Auftrag lol.Auftrag.Daten lol.Auftrag.Daten1 lol.Auftrag.Daten2 lol.Auftrag.Daten3 lol.Auftrag.Daten4 lol.Auftrag.Daten5 lol.Auftrag.Daten6 lol.Auftrag.Child1 lol.Auftrag.Child1.ChildDaten1 lol.Auftrag.Child1.ChildDaten2 lol.Auftrag.Child1.ChildDaten3 lol.Auftrag.Child1.ChildDaten4 lol.Auftrag.Daten7 lol.Auftrag.Child2 lol.Auftrag.Child2.GrandChild lol.Auftrag.Child2.GrandChild.GrandChildDaten lol.Auftrag.Child2.GrandChild.GrandChildDaten lol.Auftrag.Child2.GrandChild lol.Auftrag.Child2.GrandChild.GrandChildDaten lol.Auftrag.Child2.GrandChild.GrandChildDaten
a und b xml sind identisch, ich habe einfach nur 2 versionen mit denen ich experimentiere.
-
hmm, mir ist noch nicht klar, wie dein Gruppierungskriterium aussieht. Aber warum benutzt du xmlarray überhaupt? Ich würde das XML-Dokument so zerlegen:
namespace ConsoleApplication5 { using System; using System.Xml; using System.Xml.Linq; class Program { static void Main(string[] args) { XDocument doc = XDocument.Load(@"C:\Temp\test.xml"); int loopCount = 0; foreach (XNode node in doc.DescendantNodes()) { if (node.NodeType == XmlNodeType.Text) Console.WriteLine("{0}: {1}\t{2}\n", loopCount, node.Parent.Name, node.ToString() ); loopCount++; } Console.ReadLine(); } } }
-
Hallo Stefan,
Ich muss xmlarray benutzen , weil ich wissen muss welche Elemente in der XML vorhanden sind, damit ich die entsprechend bearbeiten kann.
Endziel ist es diese daten in eine SQL zu importieren. Aber dieses halt je nachdem welche Elemente vorhanden sind. Es kann nämlich vorkommen
das einige elementnamen doppelt vorhanden sind, aber unterschiedlich behandelt werden müssen, je nachdem in welchem Parent/Child/Grandchild sie vorhanden sind.
Beispiel:
- Child in Parent kommt in die Tabelle A
- Child in Child bei Parent kommt in Tabelle B
Deshalb lese ich die xmL erst aus und will diese Daten dann direkt abrufen.
Nachdem ich xmlarray angelegt habe kann ich mit :
string[] getrennt = xmlarray[i].Split('.'); int counter = getrennt.GetLength(0); if (counter == 5) { XDocument xmlDoc2 = XDocument.Load("c:\\a.xml"); var simpleQuery2 = (from Auftrag in xmlDoc2.Descendants(getrennt[0]).Descendants(getrennt[1]).Descendants(getrennt[2]).Descendants(getrennt[3]) select Auftrag).FirstOrDefault(); xmldes = xmldes + simpleQuery2.Element(getrennt[4]).Value + "\r\n";
Die Daten zielgenau abrufen, ich könnte jetzt also sagen , Wenn Parent = Affe dann Child speichern in Tabelle 4, etc etc.
Mit deiner Variante kann ich leider die Beziehungen nicht sehen.
Hoffe ist verständlich.....