我有一个丑陋的XML块,我试图在VB.net中解析。
基本上,我需要找到一个特定的节点,然后开始抓取该特定节点中隐藏了几个节点的所有信息。我可以构造一些东西来找到我想要的节点,并将其子节点选择到节点列表中。然后我可以遍历该节点列表并从该节点列表中提取属性,但我似乎无法找到基于所选节点创建新节点列表的方法。我已经搜索过但未能找到答案,所以我认为我做的事情从根本上说是愚蠢的。我基本上需要获取<SixithLayer>
中的所有信息并更深入地解析它,但我只能从<SixithLayer>
我的代码:
Imports System
Imports System.IO
Imports System.Xml
Public Class Form1
Sub ExampleXML()
Dim my_XML_doc As XmlDocument = New XmlDocument
Dim first_node_list As XmlNodeList
Dim second_node_list As XmlNodeList
my_XML_doc.Load("C:\temp\xmlExample.xml")
first_node_list = my_XML_doc.SelectNodes("/FirstLayer/SecondLayer/ThirdLayer//FourthLayer[@Type='Type D']//FifthLayer/*")
For Each node In first_node_list
Dim grab_first_layer_info = node.Attributes.GetNamedItem("Name").Value
second_node_list = node.SelectNodes("ImportantInfo")
For Each node2 In second_node_list
Dim grab_second_layer_info = node.Attributes.GetNamedItem("Name").Value
'Some more for looping here to get all the attributes and and innerXML values hidden in here
'unless there is a better way to quickly grab stuff that might be a variable
'number of nodes deeper with varied names.
Next
Next
End Sub
End Class
我的XML
<FirstLayer>
<SecondLayer>
<ThirdLayer>
<FourthLayer Type="Type A" Name="FirstName"></FourthLayer>
<FourthLayer Type="Type B" Name="SecondName"></FourthLayer>
<FourthLayer Type="Type C" Name="ThirdName"></FourthLayer>
<FourthLayer Type="Type D" Name="FourthName">
<FifthLayer>
<SixthLayer Type="Step" Name="First">
<SomeJunk></SomeJunk>
<ImportantInfo Name="1stImportantStuff">
<StoreValue>
<Value>500</Value>
</StoreValue>
<MoreStuff Flavor="Purple" Look="Chocolate">
<Value>29</Value>
</MoreStuff>
</ImportantInfo>
<ImportantInfo Name="2ndImportantStuff">
<StoreValue>
<Value>TRUE</Value>
</StoreValue>
</ImportantInfo>
<ImportantInfo Name="3rdImportantStuff">
<StoreValue>
<Value>Cat</Value>
</StoreValue>
</ImportantInfo>
</SixthLayer>
<SixthLayer Type="Step" Name="Second">
<SomeJunk></SomeJunk>
<ImportantInfo Name="1stImportantStuff">
<StoreValue>
<Value>500</Value>
</StoreValue>
</ImportantInfo>
<ImportantInfo Name="2ndImportantStuff">
<StoreValue>
<Value>TRUE</Value>
</StoreValue>
</ImportantInfo>
<ImportantInfo Name="3rdImportantStuff">
<StoreValue>
<Value>Cat</Value>
</StoreValue>
</ImportantInfo>
</SixthLayer>
</FifthLayer>
</FourthLayer>
</ThirdLayer>
</SecondLayer>
</FirstLayer>
感谢您的帮助。
编辑:修正它以便第二个循环按照下面的注释工作。不知道我是如何彻底错过这一点的。仍然很好奇是否有更好的方法来获取<ImportantStuff>
以及{{1}}以及除了越来越深的循环之外的所有属性和内部文本信息,但这是一个非常好的开始。谢谢您的帮助。
答案 0 :(得分:1)
我相信你这样做是最简单的方法。虽然这有点痛苦,但它比编写自己的解析器更快。
如果将内部for循环移动到另一个sub,它可能会提高代码的可读性,然后可能在该循环内部使用单独的sub。
答案 1 :(得分:0)
我正在寻找各种选择,并选择最佳和简便的方法。
我搜索了LINQ to Xml,发现了有趣的文章,该文章讨论解析XML。您可以在LINQ查询中应用where子句作为替代解决方案。
希望这会有所帮助。谢谢!