SimpleXMLElement单个元素中有两个名称空间

时间:2018-07-17 20:54:46

标签: php simplexml

我正在尝试使用SimpleXMLElement制作此xml:

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:etsi="http://uri.etsi.org/01903/v1.3.2#" Id="Signature620397">

 $signature = $invoice->addChild('ds:Signature', null, 'http://www.w3.org/2000/09/xmldsig#');
 $signature->addAttribute('xmlns:etsi', 'http://uri.etsi.org/01903/v1.3.2#');
 $signature->addAttribute('Id', 'Signature620397');

稍后在xml中,我需要引用etsi命名空间,但是我找不到方法

<etsi:QualifyingProperties Target="#Signature620397">

反正有这样做吗?否则那将是SimpleXMLElement的局限性

1 个答案:

答案 0 :(得分:0)

您可能会发现this related answer有用。

名称空间最终仅由其完整URI标识; etsi前缀可能会更改,这意味着在文档中途。 SimpleXML的设计方式,每次添加命名空间的元素或属性时,都必须提及此完整URI。

另一方面,您不需要则需要手动添加xmlns:etsi属性;当您第一次使用名称空间时,SimpleXML会自动添加它。

换句话说,你必须写:

 $xml->addChild('etsi:QualifyingProperties', null, 'http://uri.etsi.org/01903/v1.3.2#');

如果您是第一次提到该名称空间,那么SimpleXML将生成此名称:

<etsi:QualifyingProperties xmlns:etsi="http://uri.etsi.org/01903/v1.3.2#" />

或者如果前缀etsi已在文档中的那个点用正确的值定义,就这样:

<etsi:QualifyingProperties />

很显然,一遍又一遍地写出完整的URI很繁琐,但这可以通过在代码中包含一个对您有意义的名称的变量或常量来解决,就像这样:

define('XMLNS_ETSI_132', 'http://uri.etsi.org/01903/v1.3.2#');
$xml->addChild('etsi:QualifyingProperties', null, XMLNS_ETSI_132);