如何在C#3.5中对大型XML文件进行流式读取

时间:2008-09-05 09:45:59

标签: c# .net xml .net-3.5 streaming

如何在包含xs:sequence的大型XML文件上对根元素进行流式读取,而不将整个文件加载到内存中的XDocument实例中?

6 个答案:

答案 0 :(得分:9)

使用SAX样式的元素解析器和使用XmlTextReader创建的XmlReader.Create类是个好主意,是的。以下是CodeGuru中稍微修改过的代码示例:

void ParseURL(string strUrl)
{
  try
  {
    using (var reader = XmlReader.Create(strUrl))
    {
      while (reader.Read())
      {
        switch (reader.NodeType)
        {
          case XmlNodeType.Element:
            var attributes = new Hashtable();
            var strURI = reader.NamespaceURI;
            var strName = reader.Name;
            if (reader.HasAttributes)
            {
              for (int i = 0; i < reader.AttributeCount; i++)
              {
                reader.MoveToAttribute(i);
                attributes.Add(reader.Name,reader.Value);
              }
            }
            StartElement(strURI,strName,strName,attributes);
            break;
            //
            //you can handle other cases here
            //
            //case XmlNodeType.EndElement:
            // Todo
            //case XmlNodeType.Text:
            // Todo
            default:
            break;
          }
        }
      }
      catch (XmlException e)
      {
        Console.WriteLine("error occured: " + e.Message);
      }
    }
  }
}

答案 1 :(得分:7)

我无法添加评论,因为我刚刚注册但是Hirvox发布的代码示例目前被选为答案,其中有一个错误。使用静态new方法时,它不应该有Create语句。

当前:

using (var reader = new XmlReader.Create(strUrl))

修正:

using (var reader = XmlReader.Create(strUrl))

答案 2 :(得分:0)

我认为如果你想使用对象模型(即XElement \ XDocument)来查询XML是不可能的。显然,如果没有读取足够的数据,就无法构建XML对象树。但是,您可以使用XmlReader类。

  

XmlReader类读取XML数据   来自流或文件。它提供   非缓存,仅向前,只读   访问XML数据。

答案 3 :(得分:0)

Heres是一个方法:http://support.microsoft.com/kb/301228/en-us请记住,你不应该使用XmlTextReader,而是将XmlReader与XmlReader.Create结合使用

答案 4 :(得分:0)

我对提到“xs:sequence”感到困惑 - 这是一个XML Schema元素。

您是否尝试打开大型XML Schema文件?您是否打开了基于该架构的大型XML文件?或者您是否尝试打开一个大型XML文件并同时验证它?

使用标准XmlReader(或XmlValidatingReader)时,这些情况都不会给您带来任何问题。

使用XMLReader读取XML:http://msdn.microsoft.com/en-us/library/9d83k261(VS.80).aspx

答案 5 :(得分:0)

该代码示例尝试将XmlReader样式代码转换为SAX样式代码 - 如果您从头开始编写代码我只是按照预期使用XmlReader - Pull not Push。