Я создаю Atom-канал, когда я попытался добавить xmlns:i
как атрибут –
$node->addAttribute("xmlns:i","http://www.w3.org/2001/XMLSchema-instance");
Я получил это как результат –
i="http://www.w3.org/2001/XMLSchema-instance"
Часть "xmlns:"
была отключена. мне нужно избежать :
-character? Или это любой другой способ добавить это пространство имен?
Если вы хотите добавить атрибут из пространства имен / префикса i
в узел $ node, не забудьте заранее объявить пространство имен. Просто используйте третий параметр addAttribute (), чтобы предоставить URL-адрес пространства имен для префикса, который вы используете в первом параметре.
$node = new SimpleXMLElement('<root></root>'); $node->addAttribute("i:somename", "somevalue", 'http://www.w3.org/2001/XMLSchema-instance'); echo $node->asXml();
печать
<?xml version="1.0"?> <root xmlns:i="http://www.w3.org/2001/XMLSchema-instance" i:somename="somevalue"/>
Если сам атрибут не нужен, вы можете удалить его с помощью unset()
, оставив объявление пространства имен.
unset($node->attributes('i', TRUE)['somename']);
Если вы не хотите добавлять атрибут фиктивного элемента в свой корневой элемент, вы можете объявить им пространство имен вручную, добавив атрибут xmlns
для вашего i
префикса:
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
Чтобы сделать это и как намекнул на существующий ответ ( Невозможно добавить атрибут с префиксом пространства имен с помощью PHP Simplexml ), вы должны префикс нового атрибута с помощью xmlns:
(так как префикс пространства имен xmlns:
namespace не объявлен в вашем документе) , И так как 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:
prefixing, похоже, обманывает его. Обратите внимание: если вы перезагрузите элемент после установки этого атрибута, вы можете использовать url пространства имен также при добавлении дочерних элементов, и это без указания префикса:
$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? ,
Я нашел, что это ищет то же самое, и ни один из ответов на самом деле не работал для меня. Итак, я попробовал другой маршрут. Если SimpleXML неправильно управляет пространством имен, вместо этого используйте DOM.
Итак, что-то вроде этого должно работать:
$s = new simplexmlelement('<root/>'); $d = dom_import_simplexml($s); $d->setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:i", "http://www.w3.org/2001/XMLSchema-instance"); $s->addChild("bar", "bazy", "http://www.w3.org/2001/XMLSchema-instance"); $f = $s->addChild("foo", "quux"); $f->addAttribute("i:corge", "grault", "http://www.w3.org/2001/XMLSchema-instance");
Это приведет к следующему:
<?xml version="1.0"?> <root xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <i:bar>bazy</i:bar> <foo i:corge="grault">quux</foo> </root>