2011-10-24 11 views
61

Tworzę aplikację ping dla szkół z XMLem pełnym adresów URL. Utraciłem godzinę, ponieważ XmlNode.Value spowodowało wartość zerową.Wartość XmlNode vs InnerText

Potem zmieniłem go na InnerText i działało dobrze.

Teraz zastanawiam się jaka jest różnica, ponieważ MSDN mówi, że. Wartość zwraca wartość węzła, a InnerText zwraca łączone wartości węzła i wszystkich jego węzłów potomnych.

Czy ktoś może mi to wyjaśnić?

<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> 
+6

Możesz chcieć opublikować próbkę pliku XML. –

+9

@FrazellThomas - różnice między .Value i .InnerText można łatwo zrozumieć, nie widząc jego XML –

+0

Jeśli debugujesz i korzystasz z bezpośredniego okna, możesz sporo zaoszczędzić czasu na debugowanie. Pozwala na wykonanie kodu na podstawie bieżącego kontekstu i wypisze wszystkie właściwości oraz ich wartości XElement. Takie podejście pozwoliłoby łatwo rzucić okiem na wykres obiektu i zweryfikować, że wartość ma wartość NULL, ale tekst InnerText zawiera wartość. Mam nadzieję że to pomoże. –

Odpowiedz

74

Jeśli, na przykład, XML wygląda <Foo>Bar</Foo> następnie "Bar" jest faktycznie uznane za oddzielny węzeł: AN XmlText węzeł (sub-klasyfikowane z XmlNode). Właściwość Value tego węzła XmlText będzie "Bar".

"Foo" jest uważane za XmlElement (również podklasowane z XmlNode). XmlNode.Value zwraca różne rzeczy w zależności od typu węzła. Zobacz this table, która pokazuje, że Value zawsze zwraca null dla węzłów null.

InnerText węzła Foo zwraca "Pasek", ponieważ łączy wartości swoich elementów podrzędnych (w tym przypadku tylko jeden węzeł XmlText).

+23

Uwaga: xpath do wyboru TextNode będzie "Foo/text()" –

+0

Witaj Robert! W jaki sposób mogę użyć serializacji?Jeśli wezmę Twój przykład: Bar, otrzymam klasę o nazwie "Foo", ale która właściwość powinna być w moim przypadku "serią"? – PlaTyPuS

0

odniesieniu do MSDN, Value własnością XmlNodeType.Element Powroty:

null. Możesz użyć właściwości XmlElement.InnerText lub XmlElement.InnerXml, aby uzyskać dostęp do wartości węzła elementu.

+2

Czy jest możliwe, aby .InnerXml zwracał wartość null? Z moich krótkich testów nie wynika, że ​​np. Podczas tworzenia węzła jawnie przypisuję 'node.InnerXml = null;', a następnie testuję pod kątem 'node.InnerXml == null;' to jest fałsz. Zamiast tego 'node.InnerXml == string.Empty;' ma wartość true. Czy na takim zachowaniu mogę polegać? Dokumenty MSDN milczą na ten temat. –

1

Specyfikacja XML jest bardzo wrażliwa na terminologię i stanowi rodzaj obiektu XML. Jak wspomniano, element nie ma wartości. Jest to specyficzne dla attribute (i prawdopodobnie kilku innych typów węzłów), ponieważ attribute ma składnię, której nie ma element, tj. name='value'.

Jeśli uważasz, że to mylące, sprawdź różnicę między dzieckiem i potomkiem, lub węzłem głównym i elementem dokumentu!

+0

Jeszcze więcej powodów, aby porzucić XML dla JSON. – CodeMonkey

7

Miałem podobną sytuację. To, co zrobiłem, wybrałem pierwsze dziecko z bieżącego węzła i sprawdziłem, czy jest to XMLtext, a następnie wyświetlam jego wartość.

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"); 
    } 
} 
Powiązane problemy