使用多命名空间创建XML时冗余XMLNS属性问题及解决
解决DOMDocument生成XML时的冗余命名空间声明问题
问题原因
你遇到的冗余命名空间声明,根源在于调用createElementNS()创建元素时的参数错误:当你用createElementNS($xmlns['ram'], 'GuidelineSpecifiedDocumentContextParameter')创建元素时,只传入了命名空间URI,但元素名称没有带指定的前缀(ram:)。DOMDocument会默认把这个命名空间设置为该元素的默认命名空间(即xmlns="..."),而非复用根元素已经声明好的ram前缀,所以才会在子元素上重复输出命名空间声明。
正确实现方式
规范的做法是在createElementNS()的第二个参数中,明确带上对应的命名空间前缀(比如ram:),这样DOMDocument就会识别到该元素属于已在根元素声明的ram命名空间,不会再重复添加默认命名空间声明。
修正后的完整代码
$xmlns = [ 'xmlns' => 'http://www.w3.org/2000/xmlns/', 'rsm' => 'urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100', 'ram' => 'urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100', 'qdt' => 'urn:un:unece:uncefact:data:Standard:QualifiedDataType:100', 'udt' => 'urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100', 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance', ]; $document = new DOMDocument(); // 根元素带rsm前缀 $root = $document->createElementNS($xmlns['rsm'], 'rsm:CrossIndustryInvoice'); $root->setAttributeNS($xmlns['xmlns'], 'xmlns:ram', $xmlns['ram']); $root->setAttributeNS($xmlns['xmlns'], 'xmlns:qdt', $xmlns['qdt']); $root->setAttributeNS($xmlns['xmlns'], 'xmlns:udt', $xmlns['udt']); $root->setAttributeNS($xmlns['xmlns'], 'xmlns:xsi', $xmlns['xsi']); $document->appendChild($root); // rsm命名空间的元素带rsm前缀 $parent = $document->createElementNS($xmlns['rsm'], 'rsm:ExchangedDocumentContext'); // ram命名空间的元素带ram前缀 $sub = $document->createElementNS($xmlns['ram'], 'ram:GuidelineSpecifiedDocumentContextParameter'); $child = $document->createElementNS($xmlns['ram'], 'ram:ID', 'urn:cen.eu:en16931:2017'); $sub->appendChild($child); $parent->appendChild($sub); $root->appendChild($parent); $parent = $document->createElementNS($xmlns['rsm'], 'rsm:ExchangedDocument'); $child = $document->createElementNS($xmlns['ram'], 'ram:ID', 'LoremIpsum'); $parent->appendChild($child); $root->appendChild($parent); return $document->saveXML();
生成的正确XML
<?xml version="1.0"?> <rsm:CrossIndustryInvoice xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100" xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100" xmlns:qdt="urn:un:unece:uncefact:data:Standard:QualifiedDataType:100" xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <rsm:ExchangedDocumentContext> <ram:GuidelineSpecifiedDocumentContextParameter> <ram:ID>urn:cen.eu:en16931:2017</ram:ID> </ram:GuidelineSpecifiedDocumentContextParameter> </rsm:ExchangedDocumentContext> <rsm:ExchangedDocument> <ram:ID>LoremIpsum</ram:ID> </rsm:ExchangedDocument> </rsm:CrossIndustryInvoice>
内容的提问来源于stack exchange,提问作者rabudde
相关产品推荐
相关产品推荐

