【问题标题】:XmlNode Value vs InnerTextXmlNode 值与内部文本
【发布时间】: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 包含您的值。希望这会有所帮助。

标签: c# .net xml


【解决方案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】:

    关于MSDNValue属性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 中所示。

    【讨论】:

      猜你喜欢
      • 2017-08-27
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 2013-01-10
      • 2011-12-15
      • 2014-07-18
      相关资源
      最近更新 更多