如何使用DOM / PHP声明XML名称空间前缀?

我试图通过DOM / PHP5生成以下XML:
<?xml version="1.0"?>
<root xmlns:p="myNS">
  <p:x>test</p:x>
</root>

这就是我正在做的事情:

$xml = new DOMDocument('1.0');
$root = $xml->createElementNS('myNS','root');
$xml->appendChild($root);
$x = $xml->createElementNS('myNS','x','test');
$root->appendChild($x);
echo $xml->saveXML();

这就是我得到的:

<?xml version="1.0"?>
<root xmlns="myNS">
  <x>test</x>
</root>

我究竟做错了什么?如何使这个前缀工作?

解决方法

$root = $xml->createElementNS('myNS','root');

root不应该在命名空间myNS中.在原始示例中,它没有名称空间.

$x = $xml->createElementNS('myNS','test');

设置p:x的qualifiedname而不是x,以建议您使用p作为此命名空间的前缀的序列化算法.但请注意,对于具有命名空间的XML的读取器,无论是否使用p:都没有语义差异.

这将导致xmlns:p声明输出到< p:x>元素(第一个需要它).如果您希望声明位于根元素上(同样,对于带有命名空间的XML读取器没有区别),您必须明确地设置它的属性.例如.:

$root = $xml->createElementNS(null,'p:x','test');
$root->setAttributeNS('http://www.w3.org/2000/xmlns/','xmlns:p','myNS');
$root->appendChild($x);

相关文章

vue阻止冒泡事件 阻止点击事件的执行 &lt;div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些