自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,即使任一节点内的子节点数为零。
这搞砸了我的处理。我做错了吗?
感谢您的帮助。
答案 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