如何处理大型xml文件
本文关键字:大型 xml 文件 处理 何处理 | 更新日期: 2023-09-27 18:06:48
我想知道如何处理XmlReader
中的大型复杂文件。在我的例子中,它是一个非常复杂的结构,我不能在一个方法中处理所有这些。在我看来,这太脏了——所以我试着把这个方法分成几个更小的方法。
因此我从下面的代码开始:
// Create an XML reader for this file.
using (var reader = XmlReader.Create(new StringReader(fileText)))
{
while (reader.Read()){
if (reader.IsStartElement(){
switch (reader.Name){
case "FirstBigTag": MyMethod(reader, otherNecessaryMethods) break;
....
}
}
}
}
理论上这是可行的。但是我遇到过一些情况,这种行为会导致错误的状态。
在某些情况下,MyMethod正在解析正确的元素,然后我不能清楚地看到"在哪里结束",所以我不能在不读取下一个节点的情况下离开方法。这意味着我消费了一个元素而不处理它(因为这应该由main方法处理)。当我现在返回时,我回到了我的"main"方法,但这是我的消费字符串必须决定下一个必须调用哪个方法的地方。我怎么解决这个问题?有没有类似"读者"的东西。IsEndElement"或"reader"。"Look"——不读值但预见类型?
如果文件太大,内存无法容纳,您可以两全其美;使用XmlReader
读取高级节点,然后使用John Saunders提到的高级抽象,即:
case "FirstBigTag":
using(XmlReader subReader = reader.ReadSubtree())
{
XElement element = XElement.Load(subReader);
MyMethod(element);
}
break;