PHP生成XML仅根节点保留p:前缀的解决方案问询
解决方案:仅根节点带p:前缀的XML生成方法
一、正确生成目标XML的步骤
假设根节点的p:前缀对应实际业务的命名空间(比如http://www.fatturapa.gov.it/sdi/fatturapa/v1.2,替换成你需要的URI),按以下步骤实现:
初始化带命名空间的根节点
用SimpleXMLElement创建根节点时,明确指定命名空间和前缀:$rootNs = 'http://www.fatturapa.gov.it/sdi/fatturapa/v1.2'; $xml = new SimpleXMLElement("<p:FatturaElettronica xmlns:p=\"{$rootNs}\"></p:FatturaElettronica>");添加子节点时指定默认命名空间
给根节点添加子节点时,显式传入空字符串作为命名空间参数,让子节点归属默认命名空间,避免继承根节点的p:前缀:// 添加无前缀的子节点 $header = $xml->addChild('FatturaElettronicaHeader', '', ''); $datiTrasmissione = $header->addChild('DatiTrasmissione', '', ''); $datiTrasmissione->addChild('IdTrasmittente', '', ''); // 后续所有子节点都保持第三个参数为空字符串这样生成的XML仅根节点带有
p:前缀,其余子节点无前缀,且不会引入多余的dummy命名空间。
二、移除已生成XML中的多余dummy命名空间
如果已经生成了带有http://dummy.com的XML,可以用DOMDocument工具清理:
// 假设$xml是已有的SimpleXMLElement对象 $dom = dom_import_simplexml($xml)->ownerDocument; $xpath = new DOMXPath($dom); // 移除所有归属dummy命名空间的节点,转为默认命名空间节点 $dummyNodes = $xpath->query('//*[namespace-uri()="http://dummy.com"]'); foreach ($dummyNodes as $node) { $newNode = $dom->createElement($node->localName, $node->nodeValue); // 复制节点属性 foreach ($node->attributes as $attr) { $newNode->setAttribute($attr->localName, $attr->value); } $node->parentNode->replaceChild($newNode, $node); } // 移除根节点上的dummy命名空间声明 $dom->documentElement->removeAttribute('xmlns:dummy'); // 输出清理后的XML echo $dom->saveXML();
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

