繁体   English   中英

使用XMLReader仅从大型XML中的特定键进行解析的最有效方法

[英]Most Efficient Way to Parse Only From Specific Keys in a Large XML with XMLReader

假设我有一个大型XML(200-1000+ MB),而我只是想以最有效的方式获取很小的数据子集。

在我之前的一个问题中给出了一个很好的解决方案后 ,我最终编写了一个解决方案,以使用XMLReader和XMLDocument / XPath混合使用。

因此,假设我具有以下XML:

<Doc>
  <Big_Element1>
      ... LOTS of sub-elements ...
  </Big_Element1>
    .....
  <Small_Element1>
    <Sub_Element1_1 />
      ...
    <Sub_Element1_N />
  </Small_Element1>

   .....

  <Small_Element2>
    <Sub_Element2_1 />
      ...
    <Sub_Element2_N />
  </Small_Element2>

   .....
  <Big_ElementN>
      .......
  </Big_ElementN>
</Doc>

我真正需要的只是Small_ElementBig_Element的数据非常大(其中包含许多小子元素),因此,即使不需要,我也不想输入它们。

我想出了这种解决方案:

Dim doc As XmlDocument
Dim xNd As XmlNode

Using reader As XmlReader = XmlReader.Create(uri)
        reader.MoveToContent()

        While reader.Read
            If reader.NodeType = XmlNodeType.Element Then

                Select Case UCase(reader.Name)

                    Case "SMALL_ELEMENT1"
                        doc = New XmlDocument
                        xNd = doc.ReadNode(reader)
                        GetSmallElement1Data(xNd)

                    Case "SMALL_ELEMENT2"
                        doc = New XmlDocument
                        xNd = doc.ReadNode(reader)
                        GetSmallElement2Data(xNd)
                End Select
            End If
        End While
End Using

GetSmallElement1Data(xNd)GetSmallElement2Data(xNd)很容易处理,因为它们很小,所以我在其中使用XPath来获取所需的数据。

但是我的问题是,似乎该阅读器仍然可以阅读整个XML,而不仅仅是跳过Big_Element 还是不是/这是对此进行编程的正确方法?

另外,我知道此示例代码是用VB.net编写的,但我同样满意c#/ VB.net解决方案。

任何帮助/想法都将很棒!!!

谢谢!!!

假设我有一个大型XML(200-1000+ MB)

XmlReader是不解析整个文档以创建内存对象模型的唯一方法。

但是我的问题是,似乎该阅读器仍然可以阅读整个XML,而不仅仅是跳过Big_Elements。 还是不是/这是对此进行编程的正确方法?

解析器仍然必须阅读该内容:它不知道您对哪些元素感兴趣。

跳过内容的唯一选择(因此不从XmlReader.Read返回代码)是调用XmlReader.Skip :告诉解析器您感兴趣的当前节点没有后代。解析器仍然需要读取和解析查找匹配的终端节点的文本,但是如果没有运行您的代码,这将更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM