2011-01-12 4 views
3

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

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

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

Код РНР:

$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> 

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

У кого-нибудь есть решение или я уже реагирую?

:}

ответ

5

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

Для предотвращения inhertance родительского пространства имен и опустить пустой xmlns вам нужно пространство имен, как xmlns="http://example.com" у родителя. Затем $it->addChild('c', 'no ns', 'http://example.com') дает вам <c>no ns</c>.

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

+0

Rik, хотя по-прежнему требуется, чтобы у меня было пространство имен, похоже, что ваше решение хорошо подходит, особенно если я имею дело с HTML. Спасибо за ваш быстрый ответ и ответ, очень ценится. : D –

Смежные вопросы