Значение 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.