我有许多需要解析的长文档。文档格式类似于 XML,但实际上不是 xml。
这是一个例子:
<DOC>
<TEXT>it's the content P&G</TEXT>
</DOC>
<DOC>
<TEXT>it's antoher</TEXT>
</DOC>
请注意,有多个根标签 - <DOC>
,并且实体&
应该&
在 xml 中。
因此,上述文件不是标准的 xml。
我可以使用XmlDocument
来解析文件,还是应该编写自己的解析器?
您所说的有些不正确-这是“不是标准的XML”。该文档不是XML。时期。
您不能使用XmlDocument
或任何其他 XML 解析器将其解析为完整的文档。
在尝试使用 XML 解析器对其进行解析之前,您需要确保您拥有有效的 XML。
所以 - 在这种情况下,要么将文档扭曲到根元素中,要么将其分解为多个文档。在任何一种情况下,您都需要确保对特殊字符进行正确编码(引号、和号等...)。
Oakio的答案通过将文档视为 XML 片段来让您分道扬镳,但这仍然无助于无效内容,例如未转义的 & 符号。
正如@Oded 所说,这不是 XML 文档——只是一些文本。
但是,通过一些预解析,您可能可以将其转换:
将整个东西包装在一个新的根节点中:
<DOCS>
<DOC>
<TEXT>it's the content P&G</TEXT>
</DOC>
<DOC>
<TEXT>it's antoher</TEXT>
</DOC>
<DOCS>
并搜索不允许的字符并替换为它们的实体(例如'
和&
)。
正如评论中指出的那样,您应该&
首先替换以避免双重编码(即以 结尾'amp;
)
不过,您可能必须通过字符串操作来执行此操作,具体取决于您从何处获取数据。
是的,但你应该设置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)