2017-10-16 1 views
1

Ich habe Xml-Struktur wie unten und ich versuche, Knoten mit Linq zu Xml zu holen. Ich bin irgendwie fest, wie Kind Knoten Kind zu lesen, auch ich werde alle Child2 Knoten Werte als Koma getrennte Werte erhalten müssen. Außerdem müssen alle dynamischen Knoten gelesen werden, die unter dem Kindknoten vorhanden sind. Hier sind Beispiel XML's.Fetch Wert von Kind Kindknoten

Datei 1:

<parent> 
<doc> 
    <order>testorder</order> 
    <preorder>yes</preorder> 
    <child> 
    <childs1> 
     <child2>abc</child2> 
     <child2>efg</child2> 
    </childs1> 
    <preview>current</preview> 
    <provision>enable</provision> 
    </child> 
    </doc> 
    </parent> 

File 2:

<parent> 
<doc> 
    <order>testorder</order> 
    <preorder>yes</preorder> 
    <child> 
    <preview>current</preview> 
    <provision>enable</provision> 
    <other>abc</other> 
    </child> 
    </doc> 
</parent> 

Mein sudo Code:

XDocument xdoc = XDocument.Load(file); 
var customers = 
from cust in xdoc.Descendants("doc") 
     select new 
     { 
     Title = cust.Element("order").Value, 
     preorder = cust.Element("preorder").Value, 
     innernode= from inner in cust.Elements("child") 
            select new { 
             site = (inner.Element("preview") != null) ? inner.Element("preview").Value : null, 
             node=(inner.Element("childs1") != null) ? string.Join(",", from seg in inner.Elements("child2") select seg.Value) :null, 
           Should store if any extra dynamic nodes are there , 
            }, 
         }; 
          foreach(var item in customers) 
         { 
               // read all nodes 
         } 
+1

Ich verstehe nicht, was du meinst mit "Ich werde alle child2 Knotenwerte als Koma getrennt bekommen müssen". Wer ist "childs1" und "child2"? – romerotg

+1

Sorry verpasste, meine XML-Datei 1 hinzufügen, die Childs1 hatte – Blossom

Antwort

1

Ihr Code child2 zu holen versucht, in doc suchen ' s Nachkommen, aber Sie wollen die Nachkommen von childs1 betrachten. Wie bei dynamischen Feldern können Sie dies tun, indem Sie ein Wörterbuch erstellen, um alle Elemente zu erhalten, die nicht mit den hartcodierten Elementen übereinstimmen, wie unten beschrieben.

var customers = 
    from cust in xdoc.Descendants("doc") 
    select new 
    { 
     Title = cust.Element("order").Value, 
     preorder = cust.Element("preorder").Value, 
     innernode = from inner in cust.Elements("child") 
        select new 
        { 
         site = (inner.Element("preview") != null) ? inner.Element("preview").Value : null, 
         node = (inner.Element("childs1") != null) ? string.Join(",", from seg in inner.Elements("childs1").Elements("child2") select seg.Value) : null, 
         dynamicElements = inner.Elements()?.Where(e => e.Name != "preview" && e.Name != "childs1")?.ToDictionary(e => e.Name, e => e.Value) 
        }, 
    }; 
+1

Ich bekomme den Fehler mit dem DynamicElements: Ungültige anonyme Typ Mitglied Deklarator. Anonyme Member müssen mit einer Member-Zuweisung, einem einfachen Namen oder Member-Zugriff deklariert werden. – Blossom

+0

Haben Sie den genauen Code kopiert? Dieser Fehler tritt auf, wenn Sie keinen Namen auswählen. In diesem Fall hat das Mitglied einen Namen (dynamicElements). Ich habe diesen Code getestet und es funktioniert einwandfrei. Können Sie den Code senden, in dem Sie diesen Fehler erhalten, damit ich ihn testen kann? – romerotg

+0

funktioniert gut danke .. – Blossom