如何使用PHP

时间:2015-08-12 09:11:46

标签: php xml

我正在使用支付网关通过CURL发送xml。我使用XML验证器时收到以下错误:

  

XML文档中的错误:引用了实体“auml”,但没有引用   声明。

所以我理解问题在于ä,但我不确定如何使用PHP解决这个问题。

这是我传递的xml请求:

    <request type='payer-new' timestamp='XXXXXX'>
      <merchantid>XXXXXXXXX</merchantid>
      <orderid>XXXXXXXXX</orderid>
      <payer type='Business' ref='XXXXXXXXXXXXX'>                      
        <firstname>X&auml;xxxx</firstname>         
        <surname>x&auml;xxxxxx</surname>
        <address>
          <line1>XXXXXXXXXXXXX</line1>
          <line2>XXXXXXXXXXXXX</line2>
          <city>XXXXXXXXXXXXXXXX</city>
          <postcode>XXXXXXXXXXXX</postcode>
          <country code='FI'>Finland</country>
        </address>
        <phonenumbers>
          <home>XXXXXXXXXXXXXXXXXXXXXXXXX</home>
        </phonenumbers>
        <email>XXXXXXXXXXXXXXXXXXXXXXXXXXXXX</email>
      </payer>                       
      <sha1hash>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</sha1hash>
    </request>

我将所有变量中的htmlentities包含在请求中,如下所示:

  

“。htmlentities($ _ SESSION ['W_CUSTOMER_FIRSTNAME'],ENT_QUOTES,   “UTF-8”)“。

有没有办法可以处理包含这些字符的各种字符/名称/地点等?

非常感谢提前

3 个答案:

答案 0 :(得分:1)

根本问题是你有一个使用HTML实体编码事物的XML文档。 XML Validator对HTML特定实体一无所知,因此会阻塞。

我希望XML有一个XSD(架构);它应该在root标记中使用xmlns声明声明,也可以使用xsi:schemaLocation声明。这个XSD文件将是xsd的正确位置:导入html实体,使您的验证器能够正确验证。还应该有一个&lt;?xml vers ...&gt;标记为第一行。

那就是说,我怀疑接收应用程序不关心验证器所说的内容,并且假设接收者也知道html实体,你的响应文件可能就好了。

如果没有,您需要将html实体解码为实际的utf8字符,但可能只对DOM的文本元素(例如&lt; email&gt;而不是整个文本)的内容进行解码。使用php的html_entity_decode()执行此操作似乎是合理的。如果你这样做,肯定需要&lt;?xml&gt;标记以包含文件字符集。

HTH

答案 1 :(得分:1)

我为XML字符串安全替换创建了这样的函数:

     /**
     * Safe symbols escaping for XML. It's very similar to htmlspecialschars for html + mysql.
     * @param string $string
     * @return string
     */
    public static function xmlentities(string $string): string
    {
        return  htmlspecialchars($string, ENT_XML1, 'UTF-8', true);
    }

<强>用法:

        $str = 'Dafür hörten "der Relativen Schw&amp;auml;che&amp;ldquo;-Entwicklung gegen&amp;uuml;ber den Wall Street';
        $str = static::xmlentities($str);
        echo '<?xml version="1.0" encoding="UTF-8"?>
            <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
            <set>'.$str.'</set>
            </urlset>';

<强>解释

  • ENT_XML1 set是XML文档接受的符号列表
  • 'UTF-8'设置字符集,以便ä和其他德国/国家符号被接受为符号
  • true - 最后一个TRUE参数使转换安全的错误经常发生传入的字符串已经有一些htmlspecialchars前置符号(例如在从DB加载或从API获取时)

请记住将charset声明放到文档标题

<?xml version="1.0" encoding="UTF-8"?>

或为htmlspecialchars设置一些其他字符集

答案 2 :(得分:0)

我遇到了同样的问题,我已经解决了问题。

$str = 'Dafür hörten "der Relativen Schw&amp;auml;che&amp;ldquo;-Entwicklung gegen&amp;uuml;ber den Wall Street';

echo htmlspecialchars($str, ENT_XML1, 'UTF-8', true);

我希望,这是有用的,并且它正在工作