C#如何解析非标准的xml

时间:2013-07-19 09:34:58

标签: c# parsing

我有很多需要解析的长文档。文档格式类似于XML,但实际上不是xml。

以下是一个例子:

<DOC>
    <TEXT>it's the content P&G</TEXT>
</DOC> 
<DOC>
    <TEXT>it's antoher</TEXT>
</DOC>

请注意,xml中有多个根标记 - <DOC>,实体&应为&amp;

因此,上述文件不是标准的xml。

我可以使用XmlDocument来解析文件,还是应该编写自己的解析器?

3 个答案:

答案 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>

搜索不允许的字符并替换为其实体(例如&apos;&amp;)。

正如评论中所指出的,您应首先替换&以避免双重编码(即以&apos;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