代码之家  ›  专栏  ›  技术社区  ›  Pop Catalin

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

  •  10
  • Pop Catalin  · 技术社区  · 16 年前

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

    6 回复  |  直到 8 年前
        1
  •  9
  •   Pop Catalin    15 年前

    使用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);
          }
        }
      }
    }
    
        2
  •  7
  •   Felipe Sabino    11 年前

    我不能添加评论,因为我刚注册了,但是Hirvox发布的代码示例中有一个bug,当前被选为答案。它不应该有 new 使用static时的语句 Create 方法。

    电流:

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

    固定的:

    using (var reader = XmlReader.Create(strUrl))
    
        3
  •  0
  •   aku    16 年前

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

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

        4
  •  0
  •   bitbonk    16 年前

    以下是操作方法: http://support.microsoft.com/kb/301228/en-us 请记住,不应使用xmlTextReader,而应将xmlReader与xmlReader结合使用。创建

        5
  •  0
  •   samjudson    16 年前

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

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

    这些情况都不应为您提供使用标准xmlReader(或xmlValidatingReader)的问题。

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

        6
  •  0
  •   Simon Steele    16 年前

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