2

我有一个丑陋的 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>,但这是一个很好的开始。谢谢您的帮助。

4

2 回答 2

1

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

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

于 2013-09-10T03:27:14.063 回答
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

希望这可以帮助。谢谢!

于 2019-01-09T16:58:12.130 回答