如何通过&;auml;在xml中使用PHP
我使用支付网关通过CURL发送xml。使用XML验证程序时,我遇到以下错误: XML文档中的错误:引用了实体“auml”,但没有引用 声明 所以我理解问题在于ä,但是我不确定如何使用PHP解决这个问题 以下是我正在传递的xml请求:如何通过&;auml;在xml中使用PHP,php,xml,Php,Xml,我使用支付网关通过CURL发送xml。使用XML验证程序时,我遇到以下错误: XML文档中的错误:引用了实体“auml”,但没有引用 声明 所以我理解问题在于ä,但是我不确定如何使用PHP解决这个问题 以下是我正在传递的xml请求: <request type='payer-new' timestamp='XXXXXX'> <merchantid>XXXXXXXXX</merchantid> <orderid>XXX
<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>
XXXXXXXXX
XXXXXXXXX
Xä;xxxx
xä;xxxxxx
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXXXXXXXX
芬兰
XXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
我将htmlentities包装到请求中的所有变量,如下所示:
“.htmlentities($\u SESSION['W\u CUSTOMER\u FIRSTNAME',ENT\u QUOTES,
“UTF-8”)。”
是否有一种方法可以处理包含这些字符的各种字符/名称/位置等
非常感谢提前基本问题是您有一个使用HTML实体编码的XML文档。XML验证器对特定于HTML的实体一无所知,因此会阻塞 我希望XML有一个XSD(模式);它实际上应该在根标记中用xmlns声明声明,也可能用xsi:schemaLocation声明。这个XSD文件将是XSD:import html实体的正确位置,它将使您的验证器能够正确地进行验证。第一行还应该有一个标记 这就是说,我怀疑接收应用程序不会在意验证器说了什么,并且您的响应文件可能很好,假设接收者也知道html实体 如果不是,则需要将html实体解码为实际的utf8字符,但可能仅对DOM的文本元素(例如,不是整个文本的内容)进行解码。使用php的html_entity_decode()执行此操作似乎是合理的。如果这样做,您肯定需要标记包含文件字符集 嗯 我将htmlentities包装在请求中的所有变量周围,如下所示: 这是你的问题。您正在“手动”创建XML字符串。并不是说不可能这样做,只是这样做很容易出错。一个提示可能是您已经使用的函数的名称,它以“
html
”开头,它不是XML
无论如何,在深入讨论插入字符串的扩展会给创建XML带来什么麻烦之前,当出现这种问题时,使用XML库来创建XML要容易得多
XML库允许您对所有数据进行正确编码(这样您就不会看到这样的错误),并且非常容易。在PHP中,通常有三种:
- SimpleXML
- DOM
- XMLWriter
- SimpleXML
- DOM
设置了某些参数的请求的XML预设(模式)示例。这里使用SimpleXML:
$pattern=payer->姓氏='Wachsen-Überirdisch';
# ...
//这只是关于如何传递XML字符串的假定方式
//通过CURL(此处为HTTP POST请求体)连接到API
curl_setopt($handle,CURLOPT_POSTFIELDS,$xml->asXML());
将传递给远程服务的XML将始终(*)以正确的方式进行XML编码:
<?xml version="1.0"?>
<request type="payer-new" timestamp="XXXXXX">
<merchantid>XXXXXXXXX</merchantid>
<orderid>XXXXXXXXX</orderid>
<payer type="Business" ref="XXXXXXXXXXXXX">
<firstname>Äpfel</firstname>
<surname>Wachsen-Überirdisch</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>
XXXXXXXXX
XXXXXXXXX
Ä;pfel
Wachsen-和#xDC;脚气病
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXXXXXXXX
芬兰
XXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
(*)在一些罕见的情况下,情况并非如此,但它们不应在本例中扮演任何角色:SimpleXML库需要正确的UTF-8编码字符串才能工作。
ä
是一个HTML实体代码,而不是通用的XML代码
通用XML只理解三个命名实体:&代码>,
和
如果要使用任何其他命名实体,如ä代码>,这些实体必须在XML架构定义中定义。一些标准化的XML方言有定义命名实体的模式,但大多数没有,如果没有模式,那么肯定不能使用任何命名实体
因此,与在XML中使用命名实体相比,通常最好使用数字实体。其形式为和#1234
,其中1234
是所需字符的字符代码。对于auml字符,您需要的代码是ä代码>。请注意,这些数字实体代码在HTML中也可以正常工作
您可以在此处找到一些更有用的字符代码的列表:
令人烦恼的是,没有一个标准的PHP函数可以生成这些数字XML实体。htmlentities()
和html\u special\u chars()
函数不适用,因为它们会生成命名实体。所以我们必须自己写
您需要使用ord()
函数来获取字符代码,但要注意多字节字符。实际上,xmle是一种合理的尝试
<?xml version="1.0"?>
<request type="payer-new" timestamp="XXXXXX">
<merchantid>XXXXXXXXX</merchantid>
<orderid>XXXXXXXXX</orderid>
<payer type="Business" ref="XXXXXXXXXXXXX">
<firstname>Äpfel</firstname>
<surname>Wachsen-Überirdisch</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>
/**
* 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>';
<?xml version="1.0" encoding="UTF-8"?>
$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);