我有很多需要解析的长文档。文档格式类似于XML,但实际上不是xml。
以下是一个例子:
<DOC>
<TEXT>it's the content P&G</TEXT>
</DOC>
<DOC>
<TEXT>it's antoher</TEXT>
</DOC>
请注意,xml中有多个根标记 - <DOC>
,实体&
应为&
。
因此,上述文件不是标准的xml。
我可以使用XmlDocument
来解析文件,还是应该编写自己的解析器?
答案 0 :(得分:6)
你所说的有点不正确 - 这是“非标准XML”。该文档不 XML。周期。
您无法使用XmlDocument
或任何其他XML解析器将其解析为完整文档。
在尝试使用XML解析器解析之前,您需要确保拥有有效的XML。
所以 - 在这种情况下,要么在根元素中扭曲文档,要么将其分解为多个文档。在任何一种情况下,您都需要确保正确编码特殊字符(引号,符号等)。
oakio的answer通过将文档视为XML片段来帮助您解决问题,但这仍然无法解决无效内容,例如未转义的&符号。
答案 1 :(得分:2)
正如@Oded所说,这不是一个XML文档 - 只是一些文本。
然而,通过一些预解析,您可以将其转换为:
将整个事物包装在新的根节点中:
<DOCS>
<DOC>
<TEXT>it's the content P&G</TEXT>
</DOC>
<DOC>
<TEXT>it's antoher</TEXT>
</DOC>
<DOCS>
搜索不允许的字符并替换为其实体(例如'
和&
)。
正如评论中所指出的,您应首先替换&
以避免双重编码(即以'amp;
结尾)
您可能必须通过字符串操作来执行此操作,具体取决于您从何处获取数据。
答案 2 :(得分:1)
是的,但您应该设置XmlReaderSettings.ConformanceLevel
:
XmlReaderSettings settings = new XmlReaderSettings()
{
ConformanceLevel = ConformanceLevel.Fragment
};
using (XmlReader reader = XmlReader.Create(stream, settings))
{
//TODO: read here
}
更多:http://msdn.microsoft.com/en-us/library/system.xml.xmlreadersettings.conformancelevel.aspx)