XmlNode值与InnerText


73

我正在使用全URL的XML为学校创建一个ping应用程序。我因为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>

6
您可能要发布XML文件的样本。
Frazell Thomas

9
@FrazellThomas-.Value和.InnerText之间的差异可以很容易地理解,而无需查看他的XML
Robert Levy

2
如果您调试并使用即时窗口,则可以节省很多调试时间。它允许您基于当前上下文执行代码,并写出XElement的所有属性及其值。这种方法将使您轻松浏览对象图并验证Value为空,但InnerText包含您的值。希望这可以帮助。
松饼人

Answers:


89

例如,如果您的XML看起来像这样,<Foo>Bar</Foo>则实际上将“ Bar”视为一个单独的节点:一个XmlText节点(从子类化XmlNode)。该节点的Value属性为XmlText“ Bar”。

“ Foo”被认为是XmlElement(也从中子类化XmlNode)。XmlNode.Value根据节点的类型返回不同的内容。请参见本表这表明Value总是返回nullElement节点。

InnerTextFoo节点的of返回“ Bar”,因为它连接了其子节点的值(在这种情况下,只有一个XmlText节点)。


27
注意:用于选择TextNode的xpath将是“ Foo / text()”
Matthijs Wessels 2013年

罗伯特你好!我该如何使用序列化?如果以您的示例<Foo> Bar </ Foo>为例,我将有一个名为“ Foo”的类,但是我应该在哪个属性中序列化“ Bar”呢?
PlaTyPuS

7

我也有类似的情况。我所做的是,我选择了当前节点的第一个孩子,并检查它是否为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

XML规范对术语以及什么构成XML对象类型非常挑剔。如前所述,element没有价值。这是特定于attribute(可能还有其他几种节点类型)的,因为attribute它的语法element没有,即name='value'

如果您认为这令人困惑,请检查子代与子代或根节点和文档元素之间的区别!


1
放弃XML代替JSON的更多理由。
CodeMonkey '16

0

对于MSDN,返回Value属性XmlNodeType.Element

空值。您可以使用XmlElement.InnerText或XmlElement.InnerXml属性来访问元素节点的值。


3
.InnerXml是否有可能返回null?从我的简短测试来看,它似乎没有,例如,当我创建节点时,显式分配node.InnerXml = null;并测试node.InnerXml == null;其是否为假。相反,node.InnerXml == string.Empty;是真的。我可以依靠这种行为吗?MSDN文档对此保持沉默。
杰森·苏亚雷斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.