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

本文关键字:方法 有效 XMLReader 大型 XML 使用 | 更新日期: 2023-09-27 18:26:34

假设我有一个大的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

并且CCD_ 3&GetSmallElement2Data(xNd)对我来说很容易处理,因为它们很小,所以我在其中使用XPath来获得所需的数据。

但我的问题是,这个读者似乎仍然浏览整个XML,而不是跳过Big_Element s。或者这不是正确的编程方式吗??

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

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

谢谢!!!

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

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

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

但我的问题是,这个读者似乎仍然浏览整个XML,而不是跳过Big_Elements。或者这不是正确的编程方式吗??

解析器仍然需要读取这些内容:它不知道你感兴趣的元素是什么

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