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