none
LINQ XML Parent/Child "Liste" auslesen RRS feed

  • 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

    Freitag, 25. Mai 2012 18:38

Alle Antworten

  • Was steht in dem ominösen xmlarray? Was steht in a.xml und was in b.xml?
    Sonntag, 27. Mai 2012 10:10
  • 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. 

    Sonntag, 27. Mai 2012 10:16
  • 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();
            }
        }
    }

    Sonntag, 27. Mai 2012 11:07
  • 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.....

    Sonntag, 27. Mai 2012 12:34