XmlNode-Wert vs InnerText

73

Ich erstelle eine Ping-Anwendung für die Schule mit einem XML voller URLs. Ich habe eine Stunde verloren, weil dies zu XmlNode.Valueeiner Null führte.

Dann habe ich es geändert InnerTextund es hat gut funktioniert.

Jetzt habe ich mich gefragt, was der Unterschied ist, weil MSDN sagt, dass .Value den Wert des Knotens und InnerTextdie verketteten Werte des Knotens und aller seiner untergeordneten Knoten zurückgibt.

Kann mir das bitte jemand erklären?

<sites>
<site>
    <url>www.test.be</url>
    <email>[email protected]</email>
</site>
<site>
    <url>www.temp.be</url>
    <email>[email protected]</email>
</site>
<site>
    <url>www.lorim.ipsum</url>
    <email>[email protected]</email>
</site></sites>
Tom Kerkhove
quelle
6
Möglicherweise möchten Sie ein Beispiel Ihrer XML-Datei veröffentlichen.
Frazell Thomas
9
@FrazellThomas - die Unterschiede zwischen .Value und .InnerText können leicht verstanden werden, ohne sein XML zu sehen
Robert Levy
2
Wenn Sie debuggen und das unmittelbare Fenster verwenden, können Sie sich möglicherweise viel Zeit beim Debuggen sparen. Sie können Code basierend auf dem aktuellen Kontext ausführen und alle Eigenschaften und ihre Werte des XElement ausschreiben. Mit diesem Ansatz können Sie leicht einen Blick auf das Objektdiagramm werfen und überprüfen, ob der Wert null ist, aber InnerText enthält Ihren Wert. Hoffe das hilft.
Der Muffin-Mann

Antworten:

88

Wenn Ihr XML beispielsweise so aussieht, <Foo>Bar</Foo>wird "Bar" tatsächlich als separater Knoten betrachtet: als XmlTextKnoten (untergeordnet von XmlNode). Die ValueEigenschaft dieses XmlTextKnotens wäre "Bar".

"Foo" gilt als XmlElement(auch untergeordnet von XmlNode). XmlNode.ValueGibt je nach Knotentyp verschiedene Dinge zurück. Siehe diese Tabelle , die zeigt , dass Valueimmer wieder nullfür ElementKnoten.

Der InnerTextFoo-Knoten gibt "Bar" zurück, da er die Werte seiner untergeordneten Knoten verkettet (in diesem Fall nur den einen XmlTextKnoten).

Robert Levy
quelle
27
Hinweis: Der x-Pfad für die Auswahl des Textknotens wäre "Foo / text ()"
Matthijs Wessels
Hallo Robert! Wie kann ich damit die Serialisierung verwenden? Wenn ich Ihr Beispiel <Foo> Bar </ Foo> nehme, habe ich eine Klasse namens "Foo", aber welche Eigenschaft muss ich haben, damit "Bar" darin serialisiert wird?
PlaTyPuS
7

Ich hatte eine ähnliche Situation. Ich habe das erste untergeordnete Element des aktuellen Knotens ausgewählt, überprüft, ob es sich um XML-Text handelt, und dann seinen Wert angezeigt.

XmlNodeList xNList = xDOC.SelectNodes("//" + XMLElementname);

foreach (XmlNode xNode in xNList)
{
    if (xNode.ChildNodes.Count == 1 && 
        xNode.FirstChild.GetType().ToString() == "System.Xml.XmlText")
    {
        XMLElements.Add(xNode.FirstChild.Value);
    }
    else
    {
        XMLElements.Add("This is not a Leaf node");
    }
}
Santhosh Murali
quelle
1

Die XML-Spezifikation ist sehr wählerisch in Bezug auf die Terminologie und was welchen Typ von XML-Objekt ausmacht. Wie bereits erwähnt, elementhat keinen Wert. Dies ist spezifisch für attribute(und wahrscheinlich auch für einige andere Knotentypen), da attributedie Syntax elementdies nicht tut, d name='value'. H.

Wenn Sie der Meinung sind, dass dies verwirrend ist, überprüfen Sie den Unterschied zwischen Kind und Nachkomme oder dem Stammknoten und dem Dokumentelement!

Tom W.
quelle
1
Nur weitere Gründe, XML für JSON aufzugeben.
CodeMonkey
0

In Bezug auf MSDN , ValueEigentum der XmlNodeType.ElementRückgabe:

Null. Sie können die Eigenschaften XmlElement.InnerText oder XmlElement.InnerXml verwenden, um auf den Wert des Elementknotens zuzugreifen.

abatishchev
quelle
3
Kann .InnerXml null zurückgeben? Aus meinen kurzen Tests geht hervor, dass dies nicht der Fall ist, z. B. wenn ich einen Knoten erstelle, explizit zuweisen node.InnerXml = null;und dann testen, ob node.InnerXml == null;er falsch ist. Stattdessen node.InnerXml == string.Empty;ist wahr. Kann ich mich auf dieses Verhalten verlassen? MSDN-Dokumente schweigen dazu.
Jason Suárez