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