我想知道如何处理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方法处理)。当我现在返回时,我回到我的“主”方法,但这是我需要消耗字符串来确定下一个必须调用哪个方法的点。我怎么解决这个问题?是否有类似“reader.IsEndElement”或“reader.look”的内容 - 没有阅读价值但预见到类型?
答案 0 :(得分:2)
如果文件的大小太大而无法容纳在内存中,那么您可以充分利用这两个方面;使用XmlReader
读取高级节点,然后使用John Saunders提到的高级抽象,即:
case "FirstBigTag":
using(XmlReader subReader = reader.ReadSubtree())
{
XElement element = XElement.Load(subReader);
MyMethod(element);
}
break;