如何在包含xs:sequence的大型XML文件上对根元素进行流式读取,而不将整个文件加载到内存中的XDocument实例中?
答案 0 :(得分:9)
使用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);
}
}
}
}
答案 1 :(得分:7)
我无法添加评论,因为我刚刚注册但是Hirvox发布的代码示例目前被选为答案,其中有一个错误。使用静态new
方法时,它不应该有Create
语句。
当前:
using (var reader = new XmlReader.Create(strUrl))
修正:
using (var reader = XmlReader.Create(strUrl))
答案 2 :(得分:0)
我认为如果你想使用对象模型(即XElement \ XDocument)来查询XML是不可能的。显然,如果没有读取足够的数据,就无法构建XML对象树。但是,您可以使用XmlReader类。
XmlReader类读取XML数据 来自流或文件。它提供 非缓存,仅向前,只读 访问XML数据。
答案 3 :(得分:0)
Heres是一个方法:http://support.microsoft.com/kb/301228/en-us请记住,你不应该使用XmlTextReader,而是将XmlReader与XmlReader.Create结合使用
答案 4 :(得分:0)
我对提到“xs:sequence”感到困惑 - 这是一个XML Schema元素。
您是否尝试打开大型XML Schema文件?您是否打开了基于该架构的大型XML文件?或者您是否尝试打开一个大型XML文件并同时验证它?
使用标准XmlReader(或XmlValidatingReader)时,这些情况都不会给您带来任何问题。
使用XMLReader读取XML:http://msdn.microsoft.com/en-us/library/9d83k261(VS.80).aspx
答案 5 :(得分:0)
该代码示例尝试将XmlReader样式代码转换为SAX样式代码 - 如果您从头开始编写代码我只是按照预期使用XmlReader - Pull not Push。