Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过&;auml;在xml中使用PHP_Php_Xml - Fatal编程技术网

如何通过&;auml;在xml中使用PHP

如何通过&;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

我使用支付网关通过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>

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
选一个你最能合作的

或者,您可以在将“手动”创建的XML发送到远程服务之前,使用以下XML库之一验证其格式是否正确,因为它们也是XML解析器:

  • SimpleXML
  • DOM
关于如何使用其中任何一种创建XML文档的问答材料已经存在于本网站上,甚至还有示例和注释,因此我不会在回答中重复这些内容。XML验证也是如此


设置了某些参数的请求的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>&#xC4;pfel</firstname>
        <surname>Wachsen-&#xDC;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>&#xC4;pfel</firstname>
        <surname>Wachsen-&#xDC;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&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>';
<?xml version="1.0" encoding="UTF-8"?>
$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);