Значение XmlNode против InnerText

Я создаю приложение 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 ответов

Решение

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

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

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

У меня была похожая ситуация. Я выбрал первого потомка текущего узла и проверил, является ли он 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");
    }
}

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

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

Что касается MSDN, Value собственностью XmlNodeType.Element возвращает:

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

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

Другие вопросы по тегам