Intereting Posts
php – Различия между копиями, переименованием и move_uploaded_file PHP merge array (s) и удалить двойные значения Как я могу заставить set_error_handler () вызывать метод для объекта? Денормализовать вложенную структуру в объектах с помощью сериализатора symfony 2 Установлен флажок PHP для проверки на основе значения базы данных Неожиданная ошибка T_STRING в PHP PHP – как эффективно читать большие удаленные файлы и использовать буфер в цикле Как отправить деньги на paypal, используя php Модель подписки OpenCart (х месяцев) Как преобразовать базу данных MySQL в SQLite в PHP? Обновление PHP XSLT-процессора до XSLT 2.0 Можно ли получить доступ к $ this из include () 'd файла в PHP-классе? Как я могу получить изображение с URL-адреса в PHP или JQuery или в обоих? Безопасность PHP: как кодирование может быть использовано неправильно? Как отключить PHP, отсекая части длинных аргументов в трассе стека исключений?

PHP SimpleXML: как использовать двоеточие в именах

Я пытаюсь создать RSS Google Merchant, используя SimpleXML.

Образец, предоставленный Google:

<?xml version="1.0"?> <rss version="2.0" xmlns:g="http://base.google.com/ns/1.0"> <channel> <title>The name of your data feed</title> <link>http://www.example.com</link> <description>A description of your content</description> <item> <title>Red wool sweater</title> <link> http://www.example.com/item1-info-page.html</link> <description>Comfortable and soft, this sweater will keep you warm on those cold winter nights.</description> <g:image_link>http://img.ruphp.com/php/image1.jpg</g:image_link> <g:price>25</g:price> <g:condition>new</g:condition> <g:id>1a</g:id> </item> </channel> </rss> 

В моем коде есть такие вещи, как:

 $product->addChild("g:condition", 'new'); 

Что генерирует:

 <condition>new</condition> 

Я читал в Интернете, что вместо этого я должен использовать:

 $product->addChild("g:condition", 'new', 'http://base.google.com/ns/1.0'); 

Что теперь генерирует:

 <g:condition xmlns:g="http://base.google.com/ns/1.0">new</g:condition> 

Это кажется мне очень интуитивно понятным, так как теперь объявление «xmlns» находится почти на каждой строке моего RSS-канала только один раз в корневом элементе.

Я что-то упускаю?

Solutions Collecting From Web of "PHP SimpleXML: как использовать двоеточие в именах"

Как сказал @ceejayoz, вам нужно добавить пространство имен «http://base.google.com/ns/1.0&#xBB; к корневому узлу, чтобы SimpleXML знал, что пространство имен уже объявлено и не выделяет дублирующее привязку префикса.

Я думаю, вам, возможно, потребуется прочитать учебник по пространствам имен XML , потому что я не уверен, что вы действительно понимаете, что здесь делает «g:».

Вот более полный пример. XML:

 $xml = <<<EOT <?xml version="1.0"?> <rss version="2.0" xmlns:g="http://base.google.com/ns/1.0"> <channel> <title>The name of your data feed</title> <link>http://www.example.com</link> <description>A description of your content</description> <item> <title>Red wool sweater</title> <link> http://www.example.com/item1-info-page.html</link> <description>Comfortable and soft, this sweater will keep you warm on those cold winter nights.</description> <g:image_link>http://img.ruphp.com/php/image1.jpg</g:image_link> <g:price>25</g:price> <g:id>1a</g:id> </item> </channel> </rss> EOT ; 

Код:

 $rss = new SimpleXMLElement($xml); $NS = array( 'g' => 'http://base.google.com/ns/1.0' ); $rss->registerXPathNamespace('g', $NS['g']); $product = $rss->channel->item[0]; // example // Use the complete namespace. // Don't add "g" prefix to element name--what prefix will be used is // something SimpleXML takes care of. $product->addChild('condition', 'new', $NS['g']); echo $rss->asXML(); 

Обычно я использую этот шаблон для простого обращения к пространствам имен:

 $rss = new SimpleXMLElement($xml); $NS = array( 'g' => 'http://base.google.com/ns/1.0' // whatever other namespaces you want ); // now register them all in the root foreach ($NS as $prefix => $name) { $rss->registerXPathNamespace($prefix, $name); } // Then turn $NS to an object for more convenient syntax $NS = (object) $NS; // If I need the namespace name later, I access like so: $element->addChild('localName', 'Value', $NS->g); 

Это делает трюк:

 $product->addChild('xmlns:g:condition', 'new'); 

Вам нужно добавить это пространство имен к родительскому узлу, предпочтительно к корневому rss одному, чтобы дочерние узлы могли наследовать его, а не указывать его каждый раз.