使用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">
</ns1:Order> <inner_node id="1.2.1" name="inner node 1.2.1"/>
补充说明
SimpleXMLElement的addChild方法签名是:
public SimpleXMLElement::addChild(string $name, string $value = "", string $namespace = "")
当你不指定namespace参数时,方法会默认使用父节点的命名空间。通过将namespace设为空字符串,你就强制让新节点属于“无命名空间”的范畴,自然就不会带上任何前缀了。
内容的提问来源于stack exchange,提问作者Nur Diarto
相关产品推荐
相关产品推荐

