正在分析Google Analytics API XML响应


Parsing Google Analytics API XML Response

我似乎无法解析出有机关键字的度量。我使用simplexml_load_string加载整个响应字符串,然后当我打印对象时,我可以看到:

[0] => SimpleXMLElement Object
                (
                    [id] => http://www.google.com/analytics/feeds/data?ids=ga:480&ga:keyword=cats&start-date=2011-04-10&end-date=2011-07-24
                    [updated] => 2011-07-23T17:00:00.001-07:00
                    [title] => ga:keyword=cats
                    [link] => SimpleXMLElement Object
                        (
                            [@attributes] => Array
                                (
                                    [rel] => alternate
                                    [type] => text/html
                                    [href] => http://www.google.com/analytics
                                )
                        )
                )

但当我查看实际的(预格式化的)响应时,我看到了一些无法保存格式的额外数据:

<entry gd:etag="W/&quot;hdSFEs.&quot;" gd:kind="analytics#datarow"> 
<id>http://www.google.com/analytics/feeds/data?ids=ga:430&amp;ga:keyword=cats&amp;start-date=2011-04-10&amp;end-date=2011-07-24</id> 
<updated>2011-07-23T17:00:00.001-07:00</updated> 
<title>ga:keyword=cats</title> 
<link rel="alternate" type="text/html" href="http://www.google.com/analytics"/> 
<dxp:dimension name="ga:keyword" value="cats"/> 
<dxp:metric confidenceInterval="0.0" name="ga:organicSearches" type="integer" value="2"/> 
</entry> 

我需要底部的度量值,在这种情况下是2。我怎样才能拿到它?

谢谢!

编辑: Arend是对的,问题只是SimpleXML奇怪地处理了命名空间

您可能需要将整个XML响应传递给SimpleXMLElement()构造函数,而不仅仅是此处提供的片段。特别需要<feed>元素,因为它有名称空间声明:

<feed xmlns='http://www.w3.org/2005/Atom' xmlns:dxp='http://schemas.google.com/analytics/2009' xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='W/&quot;DUINSHcycSp7I2A9WxRWFEQ.&quot;' gd:kind='analytics#data'>
    <entry gd:etag="W/&quot;hdSFEs.&quot;" gd:kind="analytics#datarow"> 
    <id>http://www.google.com/analytics/feeds/data?ids=ga:430&amp;ga:keyword=cats&amp;start-date=2011-04-10&amp;end-date=2011-07-24</id> 
    <updated>2011-07-23T17:00:00.001-07:00</updated> 
    <title>ga:keyword=cats</title> 
    <link rel="alternate" type="text/html" href="http://www.google.com/analytics"/> 
    <dxp:dimension name="ga:keyword" value="cats"/> 
    <dxp:metric confidenceInterval="0.0" name="ga:organicSearches" type="integer" value="2"/> 
    </entry>
</feed>

如果没有这些名称空间声明,XML库似乎正在删除任何名称空间的属性或元素(如<dxp:metric>)。

您还可能从不同版本的XML库中获得不同的结果。在我的系统中,您的代码片段生成了一个包含所有属性和元素(包括<metric>)的SimpleXMLElement,尽管我确实收到了一些PHP警告,抱怨缺少命名空间声明。

编辑:简单的方法是:

var_dump($object->xpath('dxp:metric'));

问题是simplexml有一个带有命名空间的"gotcha"。作为kudo对松鼠的回应,您确实需要使用名称空间,但我有一种预感,您只发布了xml响应的一部分,而不是整个响应。

这里有一篇关于它的精彩帖子:http://blogs.sitepoint.com/simplexml-and-namespaces/

为了获取度量值(以及度量本身),您可以从这段代码开始。

var_dump($object->children('http://schemas.google.com/analytics/2009'));
请注意,其中有一些属性再次位于不同的命名空间中。

其余的问题也在这里得到了回答:使用SimpleXML

解析带有Namespace的XML