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 看起来像 <Foo>Bar</Foo>
,那么“Bar”实际上被视为一个单独的节点:XmlText
节点(从 XmlNode
子类化)。该XmlText
节点的Value
属性将为“Bar”。
“Foo”被认为是XmlElement
(也是XmlNode
的子类)。 XmlNode.Value
根据节点的类型返回不同的东西。请参阅this table,它表明Value
总是为Element
节点返回null
。
Foo 节点的InnerText
返回“Bar”,因为它连接了其子节点的值(在本例中,只有一个XmlText
节点)。
【讨论】:
注意:选择 TextNode 的 xpath 将是 "Foo/text()" 嗨罗伯特!我该如何使用序列化呢?如果我以您的示例我也遇到过类似的情况。我所做的是,我选择了当前节点的第一个子节点并检查它是否是 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 值与内部文本的主要内容,如果未能解决你的问题,请参考以下文章
Groovy自定义 Xml 生成器 BuilderSupport ( 创建 XmlNode 节点 | 管理 XmlNode 节点并将根节点转为 Xml 信息 | 完整代码示例 )