使用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_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
并且CCD_ 3&GetSmallElement2Data(xNd)
对我来说很容易处理,因为它们很小,所以我在其中使用XPath来获得所需的数据。
但我的问题是,这个读者似乎仍然浏览整个XML,而不是跳过Big_Element
s。或者这不是正确的编程方式吗??
此外,我知道这个示例代码是用VB.net编写的,但我对c#/VB.net解决方案同样满意。
任何帮助/想法都会很棒!!!
谢谢!!!
假设我有一个大的XML(200-1000+MB)
XmlReader
是唯一一种不解析整个文档来创建内存中对象模型的方法。
但我的问题是,这个读者似乎仍然浏览整个XML,而不是跳过Big_Elements。或者这不是正确的编程方式吗??
解析器仍然需要读取这些内容:它不知道你感兴趣的元素是什么
跳过内容(因此不会从XmlReader.Read
返回到代码)的唯一选择是调用XmlReader.Skip
:告诉解析器没有您感兴趣的当前节点的后代。解析器仍然需要读取和解析文本以找到匹配的结束节点,但如果不运行代码,这会更快。