【问题标题】:WCF/PHP - XML Parser can't handle HTML entities?WCF/PHP - XML Parser 无法处理 HTML 实体?
【发布时间】:2012-06-26 22:39:31
【问题描述】:

我的 RESTful WCF 服务接受来自客户端的 XML 请求正文,大多数客户端是 PHP 应用程序。

PHP 应用程序使用放置在元素标签中的 htmlentities() 对其请求进行编码。例如,添加新用户帐户的请求可能如下所示:

$body = "<user>
    <userName>" . htmlentities( $userName ) . "</userName>
</user>"

系统运行良好,直到今天为止,它的错误为零。

我查看了日志,发现这个请求失败了:

<user>
    <userName>&egrave;eesu</userName>
</user>

以下情况除外:

InvalidOperationException:“XML 文档 (4, 12) 中存在错误。” XmlException:“字符引用无效。第 4 行,位置 12。”

(其中第 4 行,位置 12,指的是 &lt;userName&gt; 元素的 InnerText(即字符串 &amp;egrave;eesu;)。

&amp;egrave; 是一个有效的 HTML 实体,但我知道 XML 只定义了一组最少的字符引用(&amp;amp;&amp;lt; 等),并且 XML 期望所有其他字符都在其文档编码中而是表示,因此会拒绝 &amp;egrave; 之类的内容。

有人可以确认是这种情况吗?如果是这样,我怎样才能让 PHP 只编码特定于 XML 的实体而不是 HTML 实体?

【问题讨论】:

    标签: php xml wcf


    【解决方案1】:

    XML 只有 5 个entities。解析为 html 实体会在某些字符上中断,因为它会在实体本身中创建一个未编码的 &。

    使用此函数而不是 htmlentities() 来转义实体:

    function xmlentities($string) {
    return str_replace(array("&", "<", ">", "\"", "'"),
        array("&amp;", "&lt;", "&gt;", "&quot;", "&apos;"), $string);
    }
    

    从 Tomas Jancik 的回答中借用了一个类似的问题: Generating XML document in PHP (escape characters)

    【讨论】:

      【解决方案2】:

      我改用htmlspecialchars( $userName, ENT_XML1 ),它只将最少的字符转换为实体,而无需对它们进行编码。

      @Jordan 的 str_replace 函数做同样的事情,但是当你对它进行基准测试时它会更慢,因为 htmlspecialchars 是一个原生函数。

      【讨论】:

      • ENT_XML1 不是一个有效的常量
      • @Michelangelo 是的:php.net/manual/en/function.htmlspecialchars.php "ENT_XML1 - 将代码处理为 XML 1。"。
      • 对这个选项只对特定版本的php有效
      • @Michelangelo 自 PHP 5.4.0 起定义,于 2012 年 3 月发布并一直存在,说“仅适用于特定版本的 PHP”是不正确的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多