【问题标题】:Parsing Google Analytics API XML Response解析 Google Analytics API XML 响应
【发布时间】:2011-06-01 19:38:57
【问题描述】:

我似乎无法解析出自然关键字的指标。我正在使用 simplexml_load_string 加载整个响应字符串,然后当我 print_r 对象时,我可以看到:

[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> 

我需要底部的度量值,在本例中是两个。我怎样才能得到它?

谢谢!

【问题讨论】:

    标签: php xml-parsing


    【解决方案1】:

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

    您可能需要将整个 XML 响应传递给 SimpleXMLElement() 构造函数,而不仅仅是您在此处提供的 sn-p。特别是您需要 &lt;feed&gt; 元素,因为它具有命名空间声明:

    <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 库似乎正在删除任何命名空间属性或元素(例如 &lt;dxp:metric&gt;)。

    您也可能从不同版本的 XML 库中得到不同的结果。在我的系统上,您的 sn-p 会生成一个 SimpleXMLElement,其中包含所有属性和元素,包括 &lt;metric&gt;,尽管我确实收到了一堆 PHP 警告,抱怨缺少命名空间声明。

    【讨论】:

      【解决方案2】:

      编辑:简单的出路是这样的:

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

      问题在于 simplexml 有一个带有命名空间的“陷阱”。作为松鼠的荣誉,你确实需要使用命名空间,但我有一种预感,你只发布了 xml 响应的一部分,而不是整个响应。

      这里有一篇很棒的帖子:http://blogs.sitepoint.com/simplexml-and-namespaces/

      为了获取指标的值(以及指标本身),您可以开始使用这段代码。

      var_dump($object->children('@987654322@'));
      
      请注意,其中的某些属性再次位于不同的名称空间中。

      其余的也在这里回答:Parse XML with Namespace using SimpleXML

      【讨论】:

        猜你喜欢
        • 2015-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 1970-01-01
        • 2015-03-02
        • 1970-01-01
        相关资源
        最近更新 更多