2016-11-28 3 views
0

Ich versuche, Daten von bereitgestellten zu extrahieren und fügen Sie das Objekt mit XmlReader, aber ich bemerkte auf Knoten ohne Wert, ich bekomme stattdessen "\ n".XmlReader auf Knoten ohne Wert

Beispiel xml:

<Items> 
<Item> 
    <NodeA>Some Value</NodeA> 
    <NodeB>N</NodeB> 
    <NodeC /> 
</Item> 
<Item> 
    ... 
</Item> 
</Items> 

Teil meiner modifizierten C#:

while (sub_reader.ReadToFollowing("Item")) 
{ 
    var item = new Item(); 

    sub_reader.ReadToFollowing("NodeA"); 
    sub_reader.Read(); 
    item.NodeA = sub_reader.Value; 

    sub_reader.ReadToFollowing("NodeB"); 
    sub_reader.Read(); 
    item.NodeB = sub_reader.Value; 

    sub_reader.ReadToFollowing("NodeC"); 
    sub_reader.Read(); 
    item.NodeC = sub_reader.Value;   //This return "\n " 

    this.Items.Add(item); 
} 

Gibt es eine Funktion/bequeme Art und Weise, die oben arbeiten, aber null oder eine leere Zeichenfolge, wenn <NodeC /> zurückkehren das passiert? Das echte XML ist viel größer und ich möchte es nicht auf jedem von ihnen machen.

Jeder Vorschlag wird geschätzt. Vielen Dank!

+1

scheint, dass Sie bereits Klassen Korrespondent der Struktur von Ihnen haben r xml. Verwenden Sie also 'XmlSerializer' zum Abrufen von Daten aus XML. – Fabio

+0

@Fabio XmlSerializer funktioniert Wunder, ging mit diesem für dieses Objekt, da es einer der einfacheren XML ist, die ich bekam. Vielen Dank! – Tek

Antwort

1

Anstatt Read Aufruf gefolgt von Value Eigenschaft machen, arbeiten Sie ReadElementContentAsString Methode:

sub_reader.ReadToFollowing("NodeA"); 
item.NodeA = sub_reader.ReadElementContentAsString(); 

sub_reader.ReadToFollowing("NodeB"); 
item.NodeB = sub_reader.ReadElementContentAsString(); 

sub_reader.ReadToFollowing("NodeC"); 
item.NodeC = sub_reader.ReadElementContentAsString(); 
+0

Ich ging tatsächlich mit @Fabio Kommentar oben auf mit 'XmlSerializer' für dieses Problem, da dies eine der einfacheren xml ist. Aber das ist definitiv die Antwort auf meine Frage. Vielen Dank! – Tek

+0

@Tek markieren Sie seine Frage als richtig, wenn Ihnen geholfen hat! – mybirthname

1

XDocument Mit <NodeC/>string.Empty zurückzukehren. Hier dotNetFiddle

 string xml = @"<Items> 
<Item> 
    <NodeA>Some Value</NodeA> 
    <NodeB>N</NodeB> 
    <NodeC /> 
</Item> 
<Item> 
    <NodeA>Some 2223Value</NodeA> 
    <NodeB>2223N</NodeB> 
    <NodeC>12344</NodeC> 
</Item> 
</Items>"; 

     XDocument doc = XDocument.Parse(xml); 

     var result = doc.Root.Descendants("NodeC"); 

     foreach(var item in result) 
     { 
      Console.WriteLine(item.Value); 
     } 

Wenn Sie die XDocument auf ein Objekt deserialisieren möchten Sie diese Antwort überprüfen: How do I deserialize XML into an object using a constructor that takes an XDocument?

public static MyClass FromXml (XDocument xd) 
{ 
    XmlSerializer s = new XmlSerializer(typeof(MyClass)); 
    return (MyClass)s.Deserialize(xd.CreateReader()); 
} 
+1

Interessant, lass mich damit herumspielen. Ich habe XDocument noch nie zuvor benutzt. – Tek

Verwandte Themen