如何通过ä 在 xml 中使用 PHP

Sim*_*ark 2 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>
Run Code Online (Sandbox Code Playgroud)

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

".htmlentities($_SESSION['W_CUSTOMER_FIRSTNAME'], ENT_QUOTES, "UTF-8")."

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

提前谢谢了

Spu*_*ley 6

&auml; 是一个 HTML 实体代码,而不是一个通用的 XML 代码。

通用 XML 仅理解三个命名实体:&amp;,&gt;&lt;

如果要使用任何其他命名实体(例如 )&auml;,则必须在 XML 架构定义中定义这些实体。一些标准化的 XML 方言具有定义命名实体的模式,但大多数没有,如果您没有模式,那么您肯定无法使用任何命名实体。

因此,不要在 XML 中使用命名实体,通常最好使用数字实体。它们采用 的形式&#1234;,其中1234是您想要的字符的字符代码。对于 auml 字符,您需要的代码是&#228;. 请注意,这些数字实体代码也可以在 HTML 中正常工作。

您可以在此处找到一些更有用的字符代码列表:http : //www.econlib.org/library/asciicodes.html

令人讨厌的是,没有一个标准的 PHP 函数可以生成这些数字 XML 实体。该htmlentities()html_special_chars()功能都没有合适的,因为它们产生命名实体。所以我们必须自己写。

您需要使用该ord()函数来获取字符代码,但要注意多字节字符。在手册页xmlentities()的注释中实际上对某个函数进行了合理的尝试,您可以尝试一下。不过,我知道存在其他实现。htmlentities()