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

yeg*_*256 5 php xml dom xml-namespaces

我试图通过DOM/PHP5生成以下XML:

<?xml version="1.0"?>
<root xmlns:p="myNS">
  <p:x>test</p:x>
</root>
Run Code Online (Sandbox Code Playgroud)

这就是我正在做的事情:

$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();
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

<?xml version="1.0"?>
<root xmlns="myNS">
  <x>test</x>
</root>
Run Code Online (Sandbox Code Playgroud)

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

bob*_*nce 11

$root = $xml->createElementNS('myNS', 'root');
Run Code Online (Sandbox Code Playgroud)

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

$x = $xml->createElementNS('myNS', 'x', 'test');
Run Code Online (Sandbox Code Playgroud)

设置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);
Run Code Online (Sandbox Code Playgroud)