【问题标题】:XmlElement HasChildNodes property definitionXmlElement HasChildNodes 属性定义
【发布时间】:2012-12-22 19:06:40
【问题描述】:

假设你有这个 XML 结构:

<Class>
       <Worker>
              <Name> Dan </Name>
              <Phone> 123 </Phone> 
                <Class>
                     <Address>
                        <Street> yellow brick road </Street>
                        <Zip Code> 123456 </Zip Code>
                     </Address>
                </Class>
         </Worker>
 </Class>   

使用XMLElement,我的问题是&lt;Name&gt; 元素的HasChildNodes 属性返回true,而我希望它返回false。

HasChildNodes 根据我的定义应该是这样的:&lt;Worker&gt; 有孩子,&lt;Address&gt; 也有,但 &lt;Street&gt;&lt;Name&gt; 没有孩子,他们有一个值。

如何区分这些情况?是否有其他属性具有我所期望的行为?

【问题讨论】:

  • @Downvoter:不知道答案但知道如何投票??

标签: c# .net xml xmldocument


【解决方案1】:

这是因为Name元素内的“Dan”值被视为子节点。

也许您可以测试XMLElement 是否只有XMLText 孩子,或者它是否没有XMLElement 孩子?

【讨论】:

    【解决方案2】:

    在 DOM 术语中,字符内容表示为 文本节点,因此只有完全空的元素节点(&lt;foo/&gt;&lt;bar&gt;&lt;/bar&gt;)没有子节点。您必须检查所有子节点以查看它们是否为XMLElement

    【讨论】:

    • 很好的解决方案,你知道为什么 C# 中所有的 xml 都这么难,而且与任何正常逻辑相矛盾。我需要这个进行递归,所以想象一下我应该做什么而不是简单的结束语句。顺便说一句,你回答了我用 想到的另一个问题。谢谢
    • @JavaSa 在这种情况下这不是 C# 的错 - DOM API 接口是一个(家族)W3C 规范,由委员会设计,可以在许多不同的编程语言(Java、 .NET、JavaScript 等)。因为 DOM 应该在所有语言中都以相同的方式工作,所以它往往非常“笨拙”,不太适合任何语言中的正常习语。因此,除了官方的 W3C DOM 之外,大多数语言都有替代模型,这些模型对该特定语言更自然,例如Java 中的 JDOM 或 XOM。
    • @JavaSa ... 或 C# 中的 LINQ to XML
    • 另一个问题你知道如何识别&lt;/foo&gt;,也就是XmlElement的结尾吗?
    • @JavaSa 在 DOM 中没有这样的标签表示,它只是树结构的抽象模型。在问题中的示例 XML 中,Class 元素是一个具有三个子节点的节点,一个包含 &lt;Address&gt; 标记之前的空格的文本节点,Address 元素本身,以及另一个包含 @987654330 之间的空格的文本节点@ 和 &lt;/Class&gt;.
    【解决方案3】:

    这是 vb.net 中的代码,用于检查节点是否实际上具有 xml 子元素

    Function hasXmlChildElements(ByVal node As XmlNode) As Boolean
                If node.HasChildNodes AndAlso node.ChildNodes.Count = 1 AndAlso node.FirstChild.GetType.Name.ToUpper = "XMLTEXT" Then
                    Return False
                End If
                Return node.HasChildNodes
        End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多