XmlReader - 如何处理大型XML文件?

时间:2014-06-04 18:46:54

标签: c# xml xmlreader

我想知道如何处理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”的内容 - 没有阅读价值但预见到类型?

1 个答案:

答案 0 :(得分:2)

如果文件的大小太大而无法容纳在内存中,那么您可以充分利用这两个方面;使用XmlReader读取高级节点,然后使用John Saunders提到的高级抽象,即:

case "FirstBigTag": 
    using(XmlReader subReader = reader.ReadSubtree()) 
    {
        XElement element = XElement.Load(subReader);
        MyMethod(element);
    }

    break;