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

时间:2014-10-15 16:09:15

标签: c# xml vb.net xmlreader

假设我有一个大型XML(200 - 1000+ MB),我只是想以最有效的方式获得一小部分数据。

鉴于a great solution from one of my previous questions,我最终编写了一个解决方案,以使用与XMLDocument / XPath混合的XMLReader。

所以,假设我有以下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_Element的数据和Big_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)&amp; GetSmallElement2Data(xNd)对我来说很容易处理,因为它们很小,所以我在其中使用XPath来获取我需要的数据。

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

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

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

感谢!!!

1 个答案:

答案 0 :(得分:2)

  

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

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

  

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

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

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

相关问题