You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SimpleXMLElement添加子节点时如何去除ns1前缀?

解决SimpleXMLElement添加不带命名空间前缀的子节点问题

你遇到的问题是因为根元素<ns1:Order>属于ns1命名空间,SimpleXMLElement默认会让所有子节点继承父节点的命名空间,所以自动给你创建的node、subnode等节点加上了ns1:前缀。

要生成不带前缀的子节点,你只需要在调用addChild方法时,显式指定第三个参数(命名空间)为空字符串即可。这样创建的节点就不会继承父节点的命名空间,也就不会带上ns1:前缀了。

修改后的代码如下:

$xml_header = '<?xml version="1.0" encoding="UTF-8" standalone="no"?> <ns1:Order xmlns:ns1="rrn:org.xcbl:schemas/xcbl/v3_5/xcbl35.xsd"></ns1:Order>';
$xml = new SimpleXMLElement($xml_header);

// 显式指定命名空间为空字符串
$node1 = $xml->addChild('node', '', '');
$node1->addAttribute('id', '1');
$node1->addAttribute('name', 'node 1');

$subnode1 = $node1->addChild('subnode', '', '');
$subnode1->addAttribute('id', '1.1');
$subnode1->addAttribute('name', 'subnode 1.1');

$subnode2 = $node1->addChild('subnode', '', '');
$subnode2->addAttribute('id', '1.2');
$subnode2->addAttribute('name', 'subnode 1.2');

$inner_node1 = $subnode2->addChild('inner_node', '', '');
$inner_node1->addAttribute('id', '1.2.1');
$inner_node1->addAttribute('name', 'inner node 1.2.1');

$this->response = $xml->asXML();

运行这段代码后,生成的XML就会和你期望的结构一致:

<ns1:Order xmlns:ns1="rrn:org.xcbl:schemas/xcbl/v3_5/xcbl35.xsd"><inner_node id="1.2.1" name="inner node 1.2.1"/></ns1:Order>

补充说明

SimpleXMLElement的addChild方法签名是:

public SimpleXMLElement::addChild(string $name, string $value = "", string $namespace = "")

当你不指定namespace参数时,方法会默认使用父节点的命名空间。通过将namespace设为空字符串,你就强制让新节点属于“无命名空间”的范畴,自然就不会带上任何前缀了。

内容的提问来源于stack exchange,提问作者Nur Diarto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:52:31