C#如何解析非标准的xml

问题描述:

我有很多需要解析的长文档。文档格式与XML相似,但实际上不是xml。C#如何解析非标准的xml

下面是一个例子:

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

注意,有多发性根标签 - <DOC>,与实体&应为XML &amp;

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

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

+1

会用&替换&,并用包装整个字符串...就够了吗?还是有更多? –

+0

由于它不是XML,因此您将无法使用XML解析器。你会想要决定它到底是什么,然后使用解析器来解决这个问题。 –

+0

我将会残酷地移除“XML”标签,因为这是一个关于如何解析某种非XML的语言的问题。 –

你说的有点不正确 - 这是“不标准的XML”。该文档是而不是 XML。期。

不能使用XmlDocument或任何其他XML解析器来解析它作为一个完整的文档。

在尝试使用XML解析器解析之前,您需要确保拥有有效的XML。

所以 - 在这种情况下,要么在根元素中弯曲文档,要么将其分解为多个文档。无论哪种情况,您都需要确保特殊字符编码正确(引号,&符号等)。

oakio的answer通过将文档视为XML片段来帮助您,但这仍然无助于无效内容,例如未转义的&符号。

是的,但你应该设置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

+2

这将失败,未编码的&&。 – Oded

+0

@Oded http://stackoverflow.com/a/121537/835720 – oakio

+0

当然。但是,这仍然使你的答案不完整... – Oded

由于@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;结束了)

您可能必须通过字符串操作要做到这一点,虽然,这取决于你在哪里得到数据来自。

+1

唯一的问题是字符串替换是双重编码(特别是当用'&'替换'&'时,这就是为什么它应该是_first_替换)。 – Oded