XML:如何在仅转发某些数据时进行预解析?

时间:2017-06-19 15:18:21

标签: c# xml xml-parsing

XML片段:

<field>&amp; is escaped</field>
<field>&quot;also escaped&quot;</field>
<field>is & "not" escaped</field>
<field>is &quot; and is not & escaped</field>

我正在寻找关于如何预先解析任何XML以逃避在通过解析器运行XML之前未转义的所有内容的建议?

我无法控制传递给我的XML,他们可能很快就会修复它,我必须找到解析它的方法。

我遇到的主要问题是将XML原样运行到解析器中(例如(下面))会因为某些XML没有被正确转义而导致错误而引发异常

string xml = "<field>& is not escaped</field>";
XmlReader.Create(new StringReader(xml))

3 个答案:

答案 0 :(得分:3)

我建议您使用正则表达式替换未转义的&符号与其实体等效。

This question很有帮助,因为它可以让你找到这些流氓&符号的正则表达式:

&(?!(?:apos|quot|[gl]t|amp);|#)

您可以看到它与this demo中的正确文字相符。您可以在简单的替换操作中使用它:

var escXml = Regex.Replace(xml, "&(?!(?:apos|quot|[gl]t|amp);|#)", "&amp;");

然后您就可以解析XML了。

答案 1 :(得分:0)

使用HTML Tidy设置为true的quote-ampersand预处理文本数据(不是真正的XML)。

答案 2 :(得分:0)

如果你想解析非XML的东西,首先需要确定这种语言到底是什么以及你打算用它做什么:当你为非XML语言编写一个你想要的语法时要处理,您可以决定是否可以通过预处理来处理它,或者是否需要一个完整的解析器。

例如,如果您只需要处理未转义的“&amp;”然后是一个空格,如果你不关心注释和CDATA部分内发生的事情,那么这是一个相当容易的问题。如果你不想破坏评论或CDATA的内容,或者当你没有&nbsp;的定义时需要处理像&npsp;这样的事情,那么生活开始变得更加困难。

当然,如果您编写符合标准的软件,您和您的供应商可以节省大量的时间和费用。这就是标准的用途。