我有一个需要有效阅读的大型 Xml 文件。我不能一下子把整件事都记在心里。但是,我还需要对其进行有限数量的乱序处理,因此仅按顺序读取一次是行不通的。我希望我可以创建一个新XmlReader
的 with XmlReader.ReadSubTree()
,使用原始阅读器跳到下一个兄弟元素,继续解析,然后返回并使用新阅读器读取子树。
但是,这似乎不起作用。看起来XmlReaders
您创建的新产品都使用相同的底层流,因此推进一个会推进它们。
但是,如果阅读器底层的流支持搜索(就像文件流一样),这应该是可能的。
我很高兴按顺序解析 Xml 两次(我看不出有什么办法),但我不想这样做n
,理想情况下代码应该整洁且可维护。
从概念上讲:
- Parse1:解析完整的 Xml。不要发出任何东西,但要确定
n
我想要的(不相交的)子树的开始和结束偏移量。 - Parse2:读取每个子树,但是读取它们的顺序不是文档顺序。
- ParseSub(1):寻找,然后读取子树编号
x_1
- ...
- ParseSub(n):寻找,然后读取子树编号
x_n
- ParseSub(1):寻找,然后读取子树编号
如果我可以寻找(到一个已知的文件偏移量),那么 Parse2 作为一个整体不涉及比 Parse1 更多的 Xml 读取 - 因此我正在读取整个文件两次。如果我不能寻找,那么我想我正在阅读整个文件的n/2
时间顺序。