Повторяющиеся объявления пространства имен xml php DomDocument - PullRequest
0 голосов
/ 20 октября 2018

Я использую PHP DomDocument для генерации XML.Иногда пространства имен объявляются только для корневого элемента, что является предполагаемым поведением, но иногда нет.Например:

$xml = new DOMDocument("1.0",$charset);
$ns = "http://ns.com";
$otherNs = "http://otherns.com";
$docs = $xml->createElementNS($ns,"ns:Documents");
$doc = $xml->createElementNS($otherNs, "ons:Document");
$innerElement = $xml->createElementNS($otherNs, "ons:innerElement", "someValue");
$doc->appendChild($innerElement);
$docs->appendChild($doc);
$xml->appendChild($docs);
$xml->formatOutput = true;
$xml->save("dom");

Я ожидаю:

<?xml version="1.0" encoding="UTF-8"?>
<ns:Documents xmlns:ns="http://ns.com" xmlns:ons="http://otherns.com">
  <ons:Document>
    <ons:innerElement>someValue</ons:innerElement>
  </ons:Document>
</ns:Documents>

Но получил:

<?xml version="1.0" encoding="UTF-8"?>
<ns:Documents xmlns:ns="http://ns.com" xmlns:ons="http://otherns.com">
  <ons:Document xmlns:ons="http://otherns.com">
    <ons:innerElement>someValue</ons:innerElement>
  </ons:Document>
</ns:Documents>

Почему объявление xmlns: ons = "http://otherns.com"появляется на элементе Document , но не на элементе innerElement ? А как предотвратить дублирование?

1 Ответ

0 голосов
/ 20 октября 2018

Это очень просто.Просто добавьте ваши узлы в дерево документов.Кроме того, вы можете явно создать атрибут xmlns: XXX в корневом узле.Смотрите пример:

namespace test;

use DOMDocument;

$xml = new DOMDocument("1.0", "UTF-8");

$ns = "http://ns.com";
$otherNs = "http://otherns.com";

$docs = $xml->createElementNS($ns, "ns:Documents");
$xml->appendChild($docs);

$docs->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ons', $otherNs);

$doc = $xml->createElement("ons:Document");
$docs->appendChild($doc);

$innerElement = $xml->createElement("ons:innerElement", "someValue");
$doc->appendChild($innerElement);


$xml->formatOutput = true;

echo $xml->saveXML();

Результат:

<?xml version="1.0" encoding="UTF-8"?>
<ns:Documents xmlns:ns="http://ns.com" xmlns:ons="http://otherns.com">
  <ons:Document>
    <ons:innerElement>someValue</ons:innerElement>
  </ons:Document>
</ns:Documents>
...