我试图通过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);