Как объявить префикс пространства имен XML с помощью DOM / PHP? - PullRequest
5 голосов
/ 27 августа 2010

Я пытаюсь создать следующий 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>

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

1 Ответ

11 голосов
/ 27 августа 2010
$root = $xml->createElementNS('myNS', 'root');

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

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

Установите квалифицированное имя p:x вместо просто x, чтобы предложить алгоритму сериализации, который вы хотите использовать p в качестве префикса для этого пространства имен. Однако обратите внимание, что для читателя с поддержкой XML-пространства имен нет семантической разницы, используется p: или нет.

Это приведет к выводу объявления xmlns:p на элемент <p:x> (первый, который нуждается в нем). Если вы хотите, чтобы объявление вместо этого находилось в корневом элементе (опять же, нет никакой разницы для считывателя XML-с-пространствами имен), вам придется явно setAttributeNS. 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);
...