PHP's SimpleXML: How to use colons in names

前端 未结 3 1214
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-06 05:54

I am trying to generate an RSS Google Merchant, using SimpleXML.

The sample given by Google is:




        
相关标签:
3条回答
  • 2020-12-06 06:09

    As @ceejayoz said, you need to add the "http://base.google.com/ns/1.0" namespace to the root node so that SimpleXML knows the namespace has already been declared and doesn't emit a duplicate prefix binding.

    I think you may need to read a tutorial on XML Namespaces, because I'm not sure you really understand what the "g:" is doing here.

    Here is a more complete example. 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 
    ; 
    

    Code:

    $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(); 
    

    I usually use this pattern to deal with namespaces easily:

    $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); 
    
    0 讨论(0)
  • 2020-12-06 06:11

    You need to add that namespace to a parent node, preferably the root rss one, so that the child nodes can inherit it instead of having to explicitly specify it each time.

    0 讨论(0)
  • 2020-12-06 06:19

    This do the trick:

    $product->addChild('xmlns:g:condition', 'new'); 
    
    0 讨论(0)
提交回复
热议问题