XmlNode 值与内部文本

Posted

技术标签:

【中文标题】XmlNode 值与内部文本【英文标题】:XmlNode Value vs InnerText 【发布时间】:2011-12-14 05:23:34 【问题描述】:

我正在为学校创建一个 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>

【问题讨论】:

您可能希望发布 XML 文件的示例。 @FrazellThomas - .Value 和 .InnerText 之间的区别不用看他的 XML 就很容易理解 如果您调试并使用即时窗口,您可以节省大量调试时间。它允许您根据当前上下文执行代码,并将写出 XElement 的所有属性及其值。这种方法可以让您轻松浏览对象图并验证 Value 是否为空,但 InnerText 包含您的值。希望这会有所帮助。 【参考方案1】:

例如,如果您的 XML 看起来像 &lt;Foo&gt;Bar&lt;/Foo&gt;,那么“Bar”实际上被视为一个单独的节点:XmlText 节点(从 XmlNode 子类化)。该XmlText 节点的Value 属性将为“Bar”。

“Foo”被认为是XmlElement(也是XmlNode的子类)。 XmlNode.Value 根据节点的类型返回不同的东西。请参阅this table,它表明Value 总是为Element 节点返回null

Foo 节点的InnerText 返回“Bar”,因为它连接了其子节点的值(在本例中,只有一个XmlText 节点)。

【讨论】:

注意:选择 TextNode 的 xpath 将是 "Foo/text()" 嗨罗伯特!我该如何使用序列化呢?如果我以您的示例 Bar 为例,我将有一个名为“Foo”的类,但我应该在其中序列化哪个属性?【参考方案2】:

我也遇到过类似的情况。我所做的是,我选择了当前节点的第一个子节点并检查它是否是 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(可能还有一些其他节点类型)的,因为attribute 具有element 没有的语法,即name='value'

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

【讨论】:

放弃 XML 转为 JSON 的更多理由。【参考方案4】:

关于MSDN,Value属性XmlNodeType.Element返回:

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

【讨论】:

.InnerXml 是否可以返回 null?从我的简短测试来看,情况并非如此,例如,当我创建一个节点时,明确分配 node.InnerXml = null; 然后测试 node.InnerXml == null; 它是错误的。相反,node.InnerXml == string.Empty; 是真的。我可以依赖这种行为吗? MSDN 文档对此保持沉默。【参考方案5】:

由于 url 元素是叶节点,因此 InnerText(also InnerXml) 属性包含元素值。对于元素节点,value 属性将为 null,如 msdn 文档https://msdn.microsoft.com/en-us/library/system.xml.xmlnode.value(v=VS.110).aspx 中所示。

【讨论】:

以上是关于XmlNode 值与内部文本的主要内容,如果未能解决你的问题,请参考以下文章

将字符串转换为 xmlnode

Groovy自定义 Xml 生成器 BuilderSupport ( 创建 XmlNode 节点 | 管理 XmlNode 节点并将根节点转为 Xml 信息 | 完整代码示例 )

将 XElement 转换为 XmlNode

XmlNode.RemoveChild() 递归

用标签包装 XmlNode

在 C# 中确定 XmlNode 是空还是 null?