我有一个文件,它实际上包含多个相同格式的 XML 文件,因此该文件本身不是有效的 XML;例如:
<?xml version='1.0' encoding='UTF-8'?>
<Proposal xmlns="a namespace">
<ASubnode>Text</ASubNode>
<LotsOfOtherNodes />
</Proposal>
<?xml version='1.0' encoding='UTF-8'?>
<Proposal xmlns="a namespace">
<ASubnode>Text</ASubNode>
<LotsOfOtherNodes />
</Proposal>
....
我想一次处理一个提案节点;例如:
foreach (var proposal in file)
do something
我无法使用 XmlReader,因为它在到达中间 XML 声明节点时引发异常。我可以将整个文件读入字符串,然后使用 Split 方法,但这些文件的大小为千兆字节,因此作为一种选择并不是特别有吸引力。我似乎可以一次读取一行文件,通过正则表达式搜索适当的节点,但文件不是像上面那样每行一个节点的行格式,而是包含多个节点的很长的行,以及节点文本中的随机换行符。
有没有一种方法可以在不手工制作文本解析器的情况下实现这一目标?
您有两个选择:
-
告诉 XmlReader 不要那么挑剔。设置XmlReaderSettings.ConformanceLevel到ConformanceLevel.Fragment。这将使解析器忽略不存在根节点的事实。
var settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
using (var reader = XmlReader.Create(textReader, settings))
{
...
}
用“根”元素包裹您的 XML 文件,这样您的文档将只有一个根节点
<?xml version='1.0' encoding='UTF-8'?>
<root>
<Proposal xmlns="a namespace">
<ASubnode>Text</ASubNode>
<LotsOfOtherNodes />
</Proposal>
<?xml version='1.0' encoding='UTF-8'?>
<Proposal xmlns="a namespace">
<ASubnode>Text</ASubNode>
<LotsOfOtherNodes />
</Proposal>
....
</root>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)