Intereting Posts
Как использовать Apache / PHP для защиты каталогов от пользователей, которые не вошли в систему Regex для любого английского символа ASCII, включая специальные символы Самый простой способ определить, находится ли пользователь в сети? (PHP / MySQL) PhpStorm не выделяет PHP-код внутри .php-файла при смешивании с HTML загрузка php-страницы с помощью класса в javascript PHP GD Как круговая обрезка 3 квадратных изображения и объединить в 1 изображение, поддерживающее прозрачность где вставлять функции в codeigniter mongodb Что не так с моей функцией? как читать математические уравнения файла docx, используя php-код-воспламенитель переменная php внутри echo 'html code' Почему я получаю «Нестатический метод не следует называть статически» при вызове метода в модели Eloquent? PHP Создание модальной отдельной логики из html / view doctrine2 – Как повысить эффективность флеша? Данные сеанса теряются с помощью Flash Используйте PHP или Flash для извлечения кадра из видео

Невозможно добавить пространство имен с помощью PHP SimpleXML

Я создаю 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>