如何处理大型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"——不读值但预见类型?

如何处理大型xml文件

如果文件太大,内存无法容纳,您可以两全其美;使用XmlReader读取高级节点,然后使用John Saunders提到的高级抽象,即:

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