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

C# XmlReader-如何处理大型XML文件?,c#,xml,xmlreader,C#,Xml,Xmlreader,我想知道如何在XmlReader中处理大型复杂文件。 在我的例子中,它是一个相当复杂的结构,我不适合在一个方法中处理所有这些。在我看来,这太脏了,所以我试着把这个方法分成几个较小的方法 因此,我从以下代码开始: // Create an XML reader for this file. using (var reader = XmlReader.Create(new StringReader(fileText))) { whi

我想知道如何在
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”方法,但这是我使用的字符串决定下一步调用哪个方法所必需的点。我怎样才能解决这个问题?有没有像“reader.isendement”或“reader.look”这样的东西?不读取值,但可以预见类型?

如果文件太大,无法放入内存,则可以同时使用这两种方法;使用
XmlReader
阅读高级节点,然后使用John Saunders提到的高级抽象,即:

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

    break;

为什么不使用更高级别的抽象,比如使用LINQ到XML
XmlReader
级别太低,无法使用。谢谢!我不知道这一点-我现在就开始使用它:)我可以问一下,您是从哪里了解
XmlReader
的,而不是linqtoxml的?我在想,也许我们需要一个关于“如何在.NET中读取XML”的规范性问题。我在谷歌上搜索了“在c#中读取XML”。正如您在结果中看到的,几乎每页都在谈论XmlReader。。。所以我认为这是最先进的,我们必须处理这个非常低级的系统。此外,stackoverflow中处理xml文件解析的大多数线程也讨论了XmlReader。。。LINQ转换为XML对我来说似乎非常陌生。请说出几个汉克斯!即使我现在才使用LINQtoXML读取器,我也会将您的答案标记为正确;)