Как сказал @ceejayoz, вам нужно добавить пространство имен "http://base.google.com/ns/1.0"" к корневому узлу, чтобы 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://www.example.com/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);