【问题标题】:XML: how to pre-parse when only SOME data is escaped?XML:当只有一些数据被转义时如何预解析?
【发布时间】:2017-06-19 15:18:21
【问题描述】:

XML sn-p:

<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))

【问题讨论】:

  • 该问题的答案涉及“删除”坏字符而不是修复/转义它们,这并不理想。寻找能够逃避 & 而不是删除 & 当它被传递为未转义时的能力
  • 使用 System.Net.WebUtility.HtmlDecode 或 System.Net.WebUtility.HtmlEncode。参见维基:en.wikipedia.org/wiki/…。该文件看起来像是被修改为使用 html 并且只需要转换回 xml。
  • @jdweng 不要认为这有帮助 - 你会从 &amp;amp;quot; 逃到 &amp;amp;quot;,这不是我们想要的。
  • 您可以尝试使用 DGML 解析器,我发现它比普通的 XML 解析器更能容忍结构/编码问题。过去我遇到过问题,我会从 F5 设备传回不完整的 XML,而 DGML 解析器显然是唯一能够找出错误并绕过它们的解析器。抱歉,我不记得我使用的 DGML 解析器了,大约 5 年了。

标签: c# xml xml-parsing


【解决方案1】:

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

This question 很有帮助,因为它为您提供了一个正则表达式来查找这些流氓 & 符号:

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

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

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

然后您就可以解析您的 XML。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      例如,如果您只需要处理后跟一个空格的非转义“&”,并且如果您不关心 cmets 和 CDATA 部分中发生的事情,那么这是一个相当简单的问题。如果您不想破坏 cmets 或 CDATA 的内容,或者如果您需要在没有定义 &amp;npsp; 的情况下处理 &amp;nbsp; 之类的事情,那么生活开始变得更加困难。

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

      【讨论】:

        猜你喜欢
        • 2021-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-23
        • 1970-01-01
        • 1970-01-01
        • 2017-12-15
        • 1970-01-01
        相关资源
        最近更新 更多