首页 / 知识

关于.net:如何在C#3.5中流式读取大型XML文件

2023-04-14 07:23:00

关于.net:如何在C#3.5中流式读取大型XML文件

How to do streaming read of a large XML file in C# 3.5

如何在不包含整个文件到内存中的XDocument实例的情况下,在根元素正下方包含xs:sequence的大型XML文件上进行流式读取?


使用SAX样式的元素解析器和XmlReader.Create创建的XmlTextReader类是一个好主意,是的。这是来自CodeGuru的稍作修改的代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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);
      }
    }
  }
}

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

当前:

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

已修复:

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

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


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

您是否要打开大型XML Schema文件?您是否正在打开基于该架构的大型XML文件?还是您要打开一个大型XML文件并同时对其进行验证?

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

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


这里是方法:http://support.microsoft.com/kb/301228/zh-cn仅记住您不应该使用XmlTextReader,而应将XmlReader与XmlReader.Create

结合使用


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

The XmlReader class reads XML data
from a stream or file. It provides
non-cached, forward-only, read-only
access to XML data.


文件读取元素内存

最新内容

相关内容

热门文章

推荐文章

标签云

猜你喜欢