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

时间:2010-08-27 13:51:06

标签: php xml dom xml-namespaces

我正在尝试通过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>

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

1 个答案:

答案 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);