VB.NET:xml子节点计数不正确

时间:2017-03-14 21:42:22

标签: xml vb.net visual-studio xml-parsing

自VB-DOS以来我在VB中编程,但我刚刚开始处理XML文件。我学到了很多东西,但我遇到了一个我无法克服的方面的问题。

我正在不同级别的子节点上运行循环,但如果节点没有子节点,它会被绊倒。如果节点有一个InnerText元素,我猜它会将其计为子节点,因为ChildNodes.Count总是返回1.并且布尔HasChildNodes总是返回True。事实并非如此。

例如:

<Items>
  <Item>
    <Name>Acme Widget</Name>
    <AssemblyDate>Mar 14, 2017</AssemblyDate>
  </Item>
</Items>

在此代码中,VB将为节点ChildNode.Count返回<Item>为2。非常好。但ChildNode.Count<Name>的{​​{1}}返回1,即使任一节点内的子节点数为零。

这搞砸了我的处理。我做错了吗?

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

  

&#34;如果节点有一个InnerText元素,我猜它会将其视为子节点,因为ChildNodes.Count总是返回1&#34;

是的,这是正确的,因为文本是一个节点,特别是文本节点。

您需要了解 node 元素之间的区别。有几个types of node,其中一个是文本节点<Name><AssemblyDate>每个都有一个子节点,其类型为文本节点<Item>有两个子节点,其类型为元素

您可以使用LINQ OfType()方法按节点类型过滤子节点,例如,仅计算元素:

Dim element As XmlElement
....
count = element.ChildNode.OfType(Of XmlElement).Count()

或者,自刚刚开始以来,切换到使用LINQ-to-XML,这是一个更现代的.NET解析器:

Dim element As XElement
....
count = element.Elements().Count()

答案 1 :(得分:0)

用户xml linq。标签名称区分大小写,因此我将名称更改为名称。

Imports System.Xml
Imports System.Xml.Linq
Module Module1

    Const FILENAME As String = "c:\temp\test.xml"
    Sub Main()
        Dim doc As XDocument = XDocument.Load(FILENAME)

        Dim results = doc.Descendants("Item").Select(Function(x) New With { _
                                                         .name = x.Element("Name"),
                                                         .date = CType(x.Element("AssemblyDate"), DateTime)
                                                     }).ToList()

    End Sub

End Module

答案 2 :(得分:0)

除了@ har07的答案之外,我还强烈建议您研究XML to LINQ in VB.Net更加现代的方式,它与XML Literals直接集成到VB.Net语言中:

    Dim x = <Items>
                <Item>
                    <Name>Acme Widget</Name>
                    <AssemblyDate>Mar 14, 2017</AssemblyDate>
                </Item>
            </Items>

    Dim c0 = x.<Item>.Descendants.Count '' 2
    Dim c1 = x.<Item>.Elements.Count    '' 2
    Dim c2 = x.<Item>.Nodes.Count       '' 2

    Dim c3 = x...<Name>.Elements.Count  '' 0
    Dim c4 = x...<Name>.Nodes.Count     '' 1