PHP SimpleXML-> addChild - нежелательный пустой атрибут пространства имен - PullRequest
3 голосов
/ 12 января 2011

Я пытаюсь использовать метод SimpleXML addChild для SimpleXMLElement (на самом деле SimpleXMLIterator, который является подклассом SimpleXMLElement) для добавления дочерних элементов.

Моя проблема заключается в том, что исходный документ содержит смесь элементов спространства имен и без.Вот пример simple (без каламбура):

<?xml version="1.0" encoding="UTF-8"?>
  <ns1:a xmlns:ns1="http://www.abc.com">
</ns1:a>

Код PHP:

$it = new SimpleXMLIterator ('./test.xml', 0, true);
$it->addChild('d', 'another!'); // adds new child element to parent's NS
$it->addChild('c', 'no namespace for me!', ''); // puts xmlns="" every time :(

//output xml in response:
header('Content-Type: text/xml');

echo $it->saveXML();

Проблема, как говорится в комментарии, заключается в том, что еслиЯ хочу разместить дочерний элемент без пространства имен внутри родительского элемента с пространством имен, каждый раз я получаю пустой атрибут пространства имен XML (вывод приведенного выше кода PHP):

<?xml version="1.0" encoding="UTF-8"?>
  <ns1:a xmlns:ns1="http://www.abc.com">
  <ns1:d>another!</ns1:d>
  <c xmlns="">no namespace for me!</c>
</ns1:a>

Хотя оба веб-браузера какпарсеры XML (например, Xerces), похоже, не возражают против этой избыточной разметки, я нахожу это немного раздражающим, потому что я не могу сказать, чтобы он прекратил это делать.

У кого-то есть решение, или ячрезмерно реагировать?

:}

1 Ответ

5 голосов
/ 12 января 2011

Для SimpleXML c требуется пространство имен. Если вы укажете один, он получит атрибут xmlns, потому что то, что вы указали, не было объявлено ранее. Если вы не указываете пространство имен для c, оно наследует пространство имен от родительского узла. Единственный вариант здесь - ns1. (Это случается с д.)

Чтобы предотвратить наследование родительского пространства имен и без пустого xmlns, вам понадобится пространство имен, подобное xmlns="http://example.com" у родителя. Тогда $it->addChild('c', 'no ns', 'http://example.com') дает вам <c>no ns</c>.

Однако вы не можете добавить дополнительные пространства имен, например, с addAttribute. Вы должны манипулировать входным файлом, прежде чем он будет проанализирован SimpleXML. Мне это кажется еще более уродливым, чем удаление всех пустых атрибутов xmlns из вывода.

...