我正在使用支付网关通过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äxxxx</firstname>
<surname>xä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”)“。
有没有办法可以处理包含这些字符的各种字符/名称/地点等?
非常感谢提前
答案 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&auml;che&ldquo;-Entwicklung gegen&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>';
<强>解释强>
请记住将charset声明放到文档标题
<?xml version="1.0" encoding="UTF-8"?>
或为htmlspecialchars设置一些其他字符集
答案 2 :(得分:0)
我遇到了同样的问题,我已经解决了问题。
$str = 'Dafür hörten "der Relativen Schw&auml;che&ldquo;-Entwicklung gegen&uuml;ber den Wall Street';
echo htmlspecialchars($str, ENT_XML1, 'UTF-8', true);
我希望,这是有用的,并且它正在工作