Как объявить префикс пространства имен XML с помощью DOM / PHP?

Я пытаюсь создать следующий XML с помощью DOM / PHP5:

<?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> 

Что я делаю не так? Как заставить этот префикс работать?

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

root не должен находиться в пространстве имен myNS . В исходном примере он не имеет пространства имен.

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

Задайте квалифицированное имя p:x вместо x чтобы предложить алгоритм сериализации, который вы хотите использовать как префикс для этого пространства имен. Однако обратите внимание, что для читателя с поддержкой 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);