检索所有谷歌标签xml

时间:2017-11-08 18:41:38

标签: php xml simplexml

我正在解析一个xml文件,但我有一些关于标签的问题(“:g”),我无法访问信息,他的内容,问题是当我尝试获取类别时,我有多个类别。

的xml:

<item>
      <g:id>4011700742288</g:id>
      <title><![CDATA[4711 Acqua Colonia Blood Orange & Basil Eau de Cologne 170ml]]></title>
      <link><![CDATA[https://url/asdasd.html]]></link>
      <g:image_link><![CDATA[https://url/media/catalog/product/4/7/4711-acqua-colonia-blood-_2.jpg]]></g:image_link>
      <g:price>34.86 EUR</g:price>
      <g:product_type><![CDATA[Mulher]]></g:product_type>
      <g:product_type><![CDATA[Homem]]></g:product_type>
      <g:product_type><![CDATA[Unisexo]]></g:product_type>
    </item>

我尝试使用例如:

来获取类别
$categories = $item->children('g', TRUE)->product_type; 

但它只带来第一类,而不是其他类别。 上面是我如何获取数据的代码示例。 例如:

foreach($rss->channel->item as $item) {
         $categories = $item->children('g', TRUE)->product_type; 


        // bringing in to array <content:encoded> items from SimpleXMLElement Object()
        $content = xmlObjToArr($item->children('content', true)->encoded);
          echo $categories . PHP_EOL;
    return;
}


function xmlObjToArr($obj) {
        $namespace = $obj->getDocNamespaces(true);
        $namespace[NULL] = NULL;

        $children = array();
        $attributes = array();
        $name = strtolower((string)$obj->getName());

        $text = trim((string)$obj);
        if( strlen($text) <= 0 ) {
            $text = NULL;
        }

        // get info for all namespaces
        if(is_object($obj)) {
            foreach( $namespace as $ns=>$nsUrl ) {
                // atributes
                $objAttributes = $obj->attributes($ns, true);
                foreach( $objAttributes as $attributeName => $attributeValue ) {
                    $attribName = strtolower(trim((string)$attributeName));
                    $attribVal = trim((string)$attributeValue);
                    if (!empty($ns)) {
                        $attribName = $ns . ':' . $attribName;
                    }
                    $attributes[$attribName] = $attribVal;
                }

                // children
                $objChildren = $obj->children($ns, true);
                foreach( $objChildren as $childName=>$child ) {
                    $childName = strtolower((string)$childName);
                    if( !empty($ns) ) {
                        $childName = $ns.':'.$childName;
                    }
                    $children[$childName][] = xmlObjToArr($child);
                }
            }
        }

        return array(
            'name'=>$name,
            'text'=>$text,
            'attributes'=>$attributes,
            'children'=>$children
        );
    }

1 个答案:

答案 0 :(得分:1)

您的代码是正确的。

$categories = $item->children('g', TRUE)->product_type;

这会将$categories设置为一个对象,您可以访问所有<g:product_type>元素。

问题出在你写的时候:

echo $categories . PHP_EOL;

这会显示单个XML元素的文本内容。由于$categories是多个元素的集合,因此SimpleXML猜测您想要第一个元素。换句话说,它相当于:

echo (string)$categories[0] . PHP_EOL;

(string)提取文字内容的位置由echo隐含,[0]获取该集合中的第一项。

循环使用元素集合完全符合您希望列表工作的方式 - 您使用foreach

foreach ( $categories as $cat ) {
    echo $cat . PHP_EOL;
}