如何使用SimpleXML在PHP中更改节点名称中的前缀?

时间:2014-02-04 18:22:20

标签: xml node.js

我正在编辑XML文件,根节点的所有子节点都有前缀“cfdi”。当我添加一个新节点时,它包含前缀cfdi,但我想将其更改为另一个前缀。我怎么能这样做?

样品:

<cfdi:comprobante>
<cfdi:emisor></cfdi:emisor>
<cfdi:receptor></cfdi:receptor>
<cfdi:addenda>
     <cfdi:factura />
     <cfdi:ordenCompra />
</cfdi:addenda>
</cfdi:comprobante>

我的代码就是这个

$Addenda = $xml->addChild('Addenda');
$factura = $Addenda->addChild('htx:factura');
$oc = $Addenda->addChild('htx:ordenCompra');

我的预期输出必须是这样的。

<cfdi:comprobante>
<cfdi:emisor></cfdi:emisor>
<cfdi:receptor></cfdi:receptor>
<cfdi:addenda>
    <htx:factura />  
    <htx:ordenCompra />
</cfdi:addenda><br>
</cfdi:comprobante>

2 个答案:

答案 0 :(得分:0)

请尝试以下代码,而不是$Addenda->addChild('htx:factura')

$Addenda->addChild('htx:htx:factura');

答案 1 :(得分:0)

好的,您正在使用墨西哥CFDI,并且我认为您的XML文档要大得多。

必须包括xml名称空间声明,例如xmlns:cfdi="http://www.sat.gob.mx/cfd/3"。命名空间为http://www.sat.gob.mx/cfd/3,前缀为cfdi,因此,任何以cfdi:为前缀的节点都属于http://www.sat.gob.mx/cfd/3命名空间。

要添加新的名称空间,必须在第三个参数$Addenda->addChild('htx:factura', '', NAMESPACE_HERE);中指定名称空间,请遵循以下示例:

$comprobante = new SimpleXmlElement('<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" version="3.3"/>');
$factura = $comprobante->addChild('htx:factura', '', 'http://example.com/htx-namespace');
echo $comprobante->asXml();

将产生:

<?xml version="1.0"?>
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" version="3.3">
  <htx:factura xmlns:htx="http://example.com/htx-namespace"/>
</cfdi:Comprobante>

PD:您可能会在phpCfdi社区上找到有关PHP和CFDI的帮助。