Значение XmlNode vs InnerText

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

У меня была аналогичная ситуация. Что я сделал, я выбрал первый дочерний элемент текущего node и проверил, является ли он 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");
    }
}

Ответ 3

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

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

Ответ 4

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

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