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

5
我将通过DOM/PHP5生成以下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>

我做错了什么?如何让这个前缀起作用?
1个回答

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

root 不应该在命名空间 myNS 中。在原始示例中,它不属于任何命名空间。

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

x替换为p:xqualifiedName,以便提示序列化算法您想要使用p作为该命名空间的前缀。但请注意,对于了解XML命名空间的读者来说,使用p:与否没有语义差异。

这将导致xmlns:p声明输出到需要它的第一个<p:x>元素上。如果您希望声明在根元素上(同样,对于了解XML命名空间的读者来说并没有差别),则必须显式地使用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);

1
哇,你解释得真好,这个答案确实帮助我理解了PHP DOM中命名空间的工作原理! - thomasrutter
@bobince 这个问题是否与这个问题相关:https://stackoverflow.com/questions/61530580/domdocumentload-namespace-default-prefix-was-not-found-in-entity? - HBMCS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接