10

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

4

6 回答 6

9

使用 SAX 样式的元素解析器和使用XmlReader.Create创建的XmlTextReader类将是一个好主意,是的。这是来自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);
      }
    }
  }
}
于 2008-09-05T10:02:45.580 回答
7

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

当前的:

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

固定的:

using (var reader = XmlReader.Create(strUrl))
于 2009-02-02T00:40:03.790 回答
0

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

XmlReader 类从流或文件中读取 XML 数据。它提供对 XML 数据的非缓存、只进、只读访问。

于 2008-09-05T09:51:25.200 回答
0

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

于 2008-09-05T09:54:06.553 回答
0

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

您是否尝试打开大型 XML 架构文件?您是否打开了基于该架构的大型 XML 文件?或者您是否正在尝试打开一个大型 XML 文件并同时对其进行验证?

这些情况都不应该给您使用标准 XmlReader(或 XmlValidatingReader)带来问题。

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

于 2008-09-05T09:54:24.680 回答
0

该代码示例尝试将 XmlReader 样式代码转换为 SAX 样式代码 - 如果您从头开始编写代码,我将按照预期使用 XmlReader - 拉而不是推。

于 2008-09-05T10:08:45.427 回答