【问题标题】:vb.net Reading XMLFilevb.net 读取 XMLFile
【发布时间】:2015-04-01 06:09:25
【问题描述】:

我有一个巨大的 XML 文件(20'000 行),我想从中读取一些数据。 我现在已经写了一个例程。我的问题是,有没有办法让它看起来更好?因为我认为这是从文件中获取数据的一种丑陋方式。

这是我的 XML 文件的结构

<List
<Header>
</>
<Root>
    <Items>
        <Object>
            <Items>
                <Object>
                    <Items>
                        <Object>
                            <Items>
                                <Object>
                                    <IoItems>
                                        <IoObject>
                                        </>
                                    </>
                                </>
                            </>
                            <IoItems>                           
                                <IoObject>
                                </>
                            </>
                        </>
                        <Object>
                        </>
                        <Object>
                        </>
                        <Object>
                        </>
                    </> 
                </> 
                <Object>
                    //Like the Object above
                </>
                <StructureObject>
                    //Like the Object above
                </>
            </> 
        </> 
    </> 
</> 

我的代码看起来像这样:

Dim myXMLDoc As New XmlDocument
        Dim Node As XmlNode
        Dim Node2 As XmlNode
        Dim Node3 As XmlNode
        Dim Node4 As XmlNode
        Dim Node5 As XmlNode
        Dim Node6 As XmlNode
        Dim Node7 As XmlNode
        Dim Node8 As XmlNode
        Dim Node9 As XmlNode
        Dim Node10 As XmlNode
        Dim Node11 As XmlNode

        myXMLDoc.Load("H:\Data.xml")
        Dim root As XmlNode = myXMLDoc.GetElementsByTagName("Root")(0)

        For Each Node In root.ChildNodes
            If Node.Name = "Items" Then
                For Each Node2 In Node.ChildNodes
                    If Node2.Name = "Object" Then
                        For Each Node3 In Node2.ChildNodes
                            If Node3.Name = "Items" Then
                                For Each Node4 In Node3.ChildNodes
                                    If Node4.Name = "Object" Then
                                        For Each Node5 In Node4.ChildNodes
                                            If Node5.Name = "Items" Then
                                                For Each Node6 In Node5.ChildNodes
                                                    If Node6.Name = "Object" Then
                                                        For Each Node7 In Node6.ChildNodes
                                                            If Node7.Name = "Items" Then
                                                                For Each Node8 In Node6.ChildNodes
                                                                    If Node8.Name = "Object" Then
                                                                        For Each Node9 In Node8.ChildNodes
                                                                            If Node9.Name = "IoItems" Then
                                                                                For Each Node10 In Node9.ChildNodes
                                                                                    If Node10.Name = "IoObject" Then
                                                                                        MsgBox(Node10.Value)
                                                                                    End If
                                                                                Next
                                                                            End If
                                                                        Next
                                                                    End If
                                                                Next
                                                            ElseIf Node6.Name = "IoItems" Then
                                                                For Each Node11 In Node6.ChildNodes
                                                                    If Node11.Name = "IoObject" Then
                                                                        MsgBox(Node11.Value)
                                                                    End If
                                                                Next
                                                            End If
                                                        Next
                                                    End If
                                                Next
                                            End If
                                        Next
                                    End If
                                Next
                            End If
                        Next
                    End If
                Next
            End If         
        Next

【问题讨论】:

  • 主观问题(“更好”是什么意思)不适合Stack Overflow。但是,在这种情况下,我将使用单个 XPath 表达式直接转到该值(或者失败是缺少某些东西,没有关于您的方法可以做什么的具体信息(在else 子句中)。我也会分成多种功能。
  • 请不要发明自己的 XML 语法。这使得很难提供实际上已经测试的答案,因为我们必须将您的示例转换回真正的 XML。最好从一开始就使用实际的 XML。删除不必要的部分比将所有结束标记重命名为 &lt;/&gt; 对您来说更容易。

标签: xml vb.net xml-parsing readxml


【解决方案1】:

在 VB.NET 中处理 XML 的最简单方法是使用 XElement 而不是 XmlDocument 和 XML 文字(至少在大多数情况下)。

所以要获取所有&lt;IoObject&gt; 元素,只需使用

Dim xml = XElement.Load("H:\Data.xml")

For Each node In xml...<IoObject>
    MsgBox(node.Value)
Next

【讨论】:

  • 这可以替代 XPath 吗?
  • @Tomalak 这取决于。我猜你可以用 Linq 和 XML 文字重写大多数 XPath 查询;通常我会避免使用XmlDocument 类,而是使用较新的XElement。除了阅读 cmets 和处理指令之类的特殊情况,我想我从来不必在 VB.NET 中使用 XPath。但如果XElement 也支持 XPath,我不会生气 :-)
  • 啊,这是LINQ operator。我不知道。
  • 谢谢,帮了大忙。
【解决方案2】:

您的尝试应该立即告诉您您做错了什么。如果您似乎需要 4 个或更多源代码嵌套级别,您应该向后倾斜并反思您实际尝试做的事情。您绝对不应该继续创建嵌套 21 层深的代码。

您缺少 XML 选择语言 XPath。它可以很容易地选择您感兴趣的节点。

Dim myXMLDoc As New XmlDocument
' load some XML into myXMLDoc...

For Each ioObject As XmlNode In myXMLDoc.SelectNodes("//IoObject")
    Console.WriteLine(ioObject.InnerXml)
Next ioObject

您可以定义更复杂的路径来选择准确您想要的节点。

【讨论】:

    【解决方案3】:

    如果 myXMLDoc 是一个 XMLDOM 对象,你可以这样找到每个标签链:

    Set nodes = root.selectNodes("Items/Object/Items/Object/.../IoObject")
    For Each Node In nodes
        ' do something
    Next
    

    它适用于CreateObject("MSXML.DOMDocument") 的VBScript。没有在 VB.NET 中检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      相关资源
      最近更新 更多