Значение XmlNode против InnerText - PullRequest
69 голосов
/ 24 октября 2011

Я создаю приложение ping для школы с полным URL-адресами в формате XML.Я потерял час, потому что XmlNode.Value приводил к нулю.

Затем я изменил его на InnerText, и он работал нормально.

Теперь мне было интересно, в чем разница, потому что MSDN говорит, что .Value возвращает значение узла, а InnerText возвращает объединенные значения узла и всех его дочерних узлов.

Может кто-тообъясните мне, пожалуйста?

<sites>
<site>
    <url>www.test.be</url>
    <email>test@test.be</email>
</site>
<site>
    <url>www.temp.be</url>
    <email>temp@temp.be</email>
</site>
<site>
    <url>www.lorim.ipsum</url>
    <email>interim.address@domain.com</email>
</site></sites>

Ответы [ 5 ]

83 голосов
/ 24 октября 2011

Если, например, ваш XML выглядит как <Foo>Bar</Foo>, тогда "Bar" фактически считается отдельным узлом: узлом XmlText (субкласс из XmlNode).Свойство Value этого узла XmlText будет иметь значение "Bar".

"Foo" считается XmlElement (также субклассируется из XmlNode).XmlNode.Value возвращает разные вещи в зависимости от типа узла.См. эту таблицу , которая показывает, что Value всегда возвращает null для Element узлов.

InnerText узла Foo возвращает "Bar", поскольку он объединяет значения своих дочерних элементов (в данном случае только один XmlText узел).

7 голосов
/ 31 августа 2012

У меня была похожая ситуация. Я выбрал первого потомка текущего узла и проверил, является ли он XMLtext, а затем отобразил его значение.

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");
    }
}
1 голос
/ 24 октября 2011

Спецификация XML очень требовательна к терминологии и тому, что представляет собой тип объекта XML. Как уже упоминалось, element не имеет значения. Это относится только к attribute (и, возможно, к паре других типов узлов), потому что attribute имеет синтаксис, которого нет у element, то есть name='value'.

Если вы считаете, что это сбивает с толку, проверьте разницу между дочерним элементом и потомком или корневым узлом и элементом документа!

0 голосов
/ 16 марта 2018

Поскольку элемент url является листовым узлом, свойство InnerText (также InnerXml) содержит значение элемента. Для узлов элементов свойство value будет нулевым, как показано в документации MSDN https://msdn.microsoft.com/en-us/library/system.xml.xmlnode.value(v=VS.110).aspx.

0 голосов
/ 24 октября 2011

Относительно MSDN , Value свойство XmlNodeType.Element возвращает:

нуль. Вы можете использовать свойства XmlElement.InnerText или XmlElement.InnerXml, чтобы получить доступ к значению узла элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...