在VB.NET中解析复杂的XML

时间:2013-09-09 16:47:11

标签: xml vb.net xml-parsing

我有一个丑陋的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}}以及除了越来越深的循环之外的所有属性和内部文本信息,但这是一个非常好的开始。谢谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我相信你这样做是最简单的方法。虽然这有点痛苦,但它比编写自己的解析器更快。

如果将内部for循环移动到另一个sub,它可能会提高代码的可读性,然后可能在该循环内部使用单独的sub。

答案 1 :(得分:0)

我正在寻找各种选择,并选择最佳和简便的方法。

我搜索了LINQ to Xml,发现了有趣的文章,该文章讨论解析XML。您可以在LINQ查询中应用where子句作为替代解决方案。

这里是文章 https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/concepts/linq/how-to-write-queries-on-xml-in-namespaces

希望这会有所帮助。谢谢!