![](/img/trans.png)
[英]most efficient way in c# to parse a large Xml string (to expand DTD references, add new lines etc)
[英]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_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)
和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.