Как объявить префикс пространства имен 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>

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


person yegor256    schedule 27.08.2010    source источник


Ответы (1)


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

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

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

Задайте в параметреqualName значение 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);
person bobince    schedule 27.08.2010
comment
Вау, вы очень хорошо это объяснили, и этот один ответ действительно помог мне понять, как на самом деле работают пространства имен в PHP DOM! - person thomasrutter; 24.09.2010
comment
@bobince Это: stackoverflow.com/questions/61530580/, связанной с этой проблемой? - person HBMCS; 30.04.2020