简体   繁体   中英

How to declare an XML namespace prefix with DOM/PHP?

I'm trying to produce the following XML by means of DOM/PHP5:

<?xml version="1.0"?>
<root xmlns:p="myNS">
  <p:x>test</p:x>
</root>

This is what I'm doing:

$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();

This is what I'm getting:

<?xml version="1.0"?>
<root xmlns="myNS">
  <x>test</x>
</root>

What am I doing wrong? How to make this prefix working?

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

root shouldn't be in namespace myNS . In the original example, it is in no namespace.

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

Set a qualifiedName of p:x instead of just x to suggest to the serialisation algorithm that you want to use p as the prefix for this namespace. However note that to an XML-with-Namespaces-aware reader there is no semantic difference whether p: is used or not.

This will cause the xmlns:p declaration to be output on the <p:x> element (the first one that needs it). If you want the declaration to be on the root element instead (again, there is no difference to an XML-with-Namespaces reader), you will have to setAttributeNS it explicitly. eg.:

$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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM