如何在不包含整个文件到内存中的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.