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

关于.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.


推荐阅读

    linux命令添加文件?

    linux命令添加文件?,工作,简介,数据,系统,文件,命令,操作,文件名,内容,终端,l

    linux文件中剪切命令?

    linux文件中剪切命令?,位置,系统,工作,命令,发行,连续,标准,终端,文件,目录,l

    linux存储文件命令?

    linux存储文件命令?,系统,地址,工作,命令,软件,电脑,标准,底部,信息,文件,lin

    linux命令移除文件夹?

    linux命令移除文件夹?,命令,文件夹,通用,不了,数据,名称,档案,系统,文件,目

    在linux文件后加命令?

    在linux文件后加命令?,系统,工作,命令,工具,电脑,基础,管理,情况,第一,简介,L

    linux命令删除文件夹?

    linux命令删除文件夹?,系统,名称,环境,文件夹,不了,命令,文件,数据,档案,目

    linux命令看文件编码?

    linux命令看文件编码?,状态,系统,文件,工具,名称,数据,命令,格式,汉字,以下,L

    linux编辑文件的命令?

    linux编辑文件的命令?,系统,地址,工作,状态,命令,电脑,信息,管理,目录,终端,l

    linux命令行关掉文件?

    linux命令行关掉文件?,地址,状态,工作,系统,信息,命令,名字,电脑,编辑,文件,l

    linux分隔文件命令?

    linux分隔文件命令?,系统,信息,文件,命令,位置,指令,文件夹,目录,前缀,方法,l

    linux改文件权限命令?

    linux改文件权限命令?,系统,工具,档案,权限,文件,信息,命令,目录,选项,用户,

    linux命令交换文件名?

    linux命令交换文件名?,命令,文件,数据,名称,工具,地址,软件,系统,基础知识,

    linux文件夹转移命令?

    linux文件夹转移命令?,系统,文件,命令,位置,材料,信息,工具,电脑,目录,源文

    linux转移文件命令?

    linux转移文件命令?,文件,命令,密码,电脑,位置,名称,信息,系统,目录,目标,lin

    linux下替换文件命令?

    linux下替换文件命令?,文件,一致,评论,名称,标的,资料,工作,命令,字符串,内

    linux文件nl命令?

    linux文件nl命令?,地址,工作,信息,系统,情况,标准,实时,对比,百度,命令,linux

    linux寻找文件夹命令?

    linux寻找文件夹命令?,名称,命令,文件,位置,工作,标准,目录,子目录,文件名,

    linux跳到文件尾命令?

    linux跳到文件尾命令?,系统,文件,命令,管理,状态,实时,末尾,光标,内容,编辑,l

    linux把文件复制命令?

    linux把文件复制命令?,名字,文件,软件,系统,位置,目录,命令,源文件,目标,文