2009-06-11 15 views
2

Ich habe eine XML, die ich alle Elemente erhalten möchte. Ich habe versucht, die Elemente von Nachkommen() oder DescendantNodes() bekommen, aber beide zurück mir wiederholt KnotenAufruf der DescendantNodes, ohne jeden Knoten zu wiederholen

Zum Beispiel, hier ist mein xml:

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <FirstElement xsi:type="myType"> 
    <SecondElement>A</SecondElement> 
    </FirstElement> 
</Root> 

und wenn ich diese Schnipsel:

XElement Elements = XElement.Parse(XML); 
IEnumerable<XElement> xElement = Elements.Descendants(); 
IEnumerable<XNode> xNodes = Elements.DescendantNodes(); 
foreach (XNode node in xNodes) 
{ 
    stringBuilder.Append(node); 
} 

es gibt mir zwei Knoten, aber die <SecondElement> wiederholen. Ich weiß, Nachkommen nennen ihre Kinder und Kinder eines Kindes die ganze Zeit, aber gibt es einen anderen Weg, es zu vermeiden?

Dann ist dies der Inhalt meiner String:

<FirstElement xsi:type="myType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SecondElement>A</SecondElement> 
</FirstElement> 

<SecondElement>A</SecondElement> 

Antwort

5

gut kennen Sie eigentlich wollen alle Nachkommen oder nur die Top-Level-Elemente? Wenn Sie nur die obersten Ebenen möchten, verwenden Sie die Methode Elements(), die alle Elemente direkt unter dem aktuellen Knoten zurückgibt.

Das Problem ist nicht, dass Knoten wiederholt werden - es ist, dass die übergeordneten Knoten die unteren Knoten enthalten. Also wird der übergeordnete Knoten zurückgegeben, dann der untergeordnete, und Sie schreiben die ganze dieser beiden Knoten, was bedeutet, dass Sie den untergeordneten Knoten zweimal ausschreiben.

Wenn Sie nur schreiben, sagen Sie, den Namen des Knotens, den Sie betrachten, werden Sie kein Problem sehen. Aber Sie haben nicht gesagt, was Sie wirklich zu tun versuchen, so weiß ich nicht, ob das hilft ...

+0

Schließlich möchte ich nur haben A B paradisonoir

+0

von "haben", was genau Sie aber bedeuten ? Schreiben Sie diese * tatsächlich * in einen StringBuilder oder war das nur zur Diagnose? Es hört sich so an, als müssten Sie nur einen Aufruf an Elements() senden. –

+0

nein Ich muss sie in einen Zeichenfolgengenerator schreiben und speichern. – paradisonoir

0
XmlDocument doc = new XmlDocument(); 
doc.LoadXml(XML); 
XmlNodeList allElements = doc.SelectNodes("//*"); 
foreach(XmlElement element in allElements) 
{ 
    // your code here 
} 
+0

Dies führt zu demselben Verhalten. – AnthonyWJones

+0

Ich denke, das Jon fand das wahre Problem war das Schreiben von allen Knoten, nicht tatsächlich mehrere Knoten zurückgeben. – Greg

+0

Ich korrigierte meine Frage. – paradisonoir

Verwandte Themen