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

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

使用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); } } } } 

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

当前:

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

固定:

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

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

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

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

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

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

这些情况都不会使用标准XmlReader(或XmlValidatingReader)来解决问题。

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

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