Если вы не хотите добавлять фиктивный атрибут к корневому элементу, вы можете вручную объявить для него пространство имен, добавив атрибут xmlns
для вашего префикса i
:
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
Для этого, как указано в существующем ответе (Невозможно добавить атрибут с префиксом пространства имен с помощью PHP Simplexml), вы должны добавить к новому атрибуту префикс xmlns:
(поскольку префикс пространства имен xmlns:
не объявлен в вашем документе). И поскольку xmlns:
является частью имени этого атрибута, вам нужно два вхождения xmlns:
$uri = 'http://www.w3.org/2001/XMLSchema-instance';
$root = new SimpleXMLElement('<root/>');
$root->addAttribute( 'xmlns:xmlns:i', $uri );
######
$child = $root->addChild('foo');
$child->addAttribute( 'xmlns:i:bar', 'baz');
######
echo $root->asXml();
Выдает (отформатировано вручную для удобочитаемости):
<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<foo i:bar="baz"/>
</root>
Так что этот префикс xmlns:
кажется обманом. Обратите внимание, что если вы перезагрузите элемент после установки этого атрибута, можно также использовать uri пространства имен при добавлении дочерних элементов, и это без указания префикса:
$root = new SimpleXMLElement( $root->asXML() );
$child = $root->addChild('foo');
$child->addAttribute( 'i:bar', 'bazy', $uri );
####
echo $root->asXml();
Выдает (опять же отформатировано вручную):
<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<foo i:bar="baz"/>
<foo i:bar="bazy"/>
</root>
Этот второй пример кажется более близким к предполагаемому (или, по крайней мере, ожидаемому) использованию.
Обратите внимание, что единственный способ сделать это правильно — использовать более полный (но, к сожалению, более сложный и многословный) DOMDocument. Это описано в разделе Как объявить префикс пространства имен XML с помощью DOM/PHP?.
person
Olivier 'Ölbaum' Scherler
schedule
22.02.2012