我正在尝试通过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>
我做错了什么?如何使这个前缀工作?
答案 0 :(得分:11)
$root = $xml->createElementNS('myNS', 'root');
root
不应位于命名空间myNS
中。在原始示例中,它没有名称空间。
$x = $xml->createElementNS('myNS', 'x', 'test');
将qualifiedName设置为p:x
而不是x
,以向序列化算法建议您使用p
作为此命名空间的前缀。但请注意,对于具有名称空间感知的XML读取器,无论是否使用p:
,都没有语义差异。
这将导致xmlns:p
声明在<p:x>
元素(第一个需要它)上输出。如果您希望声明位于根元素上(同样,XML-with-Namespaces阅读器没有区别),您必须明确setAttributeNS
它。例如:
$root = $xml->createElementNS(null, 'root');
$xml->appendChild($root);
$x = $xml->createElementNS('myNS', 'p:x', 'test');
$root->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:p', 'myNS');
$root->appendChild($x);