假设我有一个大型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解决方案同样熟悉。
任何帮助/想法都会很棒!!!
感谢!!!
答案 0 :(得分:2)
假设我有一个大型XML(200 - 1000+ MB)
XmlReader
是唯一一种不解析整个文档来创建内存对象模型的方法。
但我的问题是,这个读者似乎仍然会浏览整个XML,而不仅仅是跳过Big_Elements。或者这不是/这是编程这个的正确方法吗?
解析器仍然必须阅读该内容:它不知道您感兴趣的元素。
跳过内容(因此不会从XmlReader.Read
返回代码)的唯一选择是调用XmlReader.Skip
:告诉解析器没有您感兴趣的当前节点的后代。解析器仍然需要读取和解析文本以找到匹配的结束节点,但如果没有运行代码,这将更快。