dox19458 2012-03-12 03:41
浏览 32
已采纳

SimpleXMLElement,xpath和子元素

I am accessing the gData Api on YouTube. I'll use this xml for reference.

I'm using xpath on a child SimpleXMLElement object, but rather than the xpath searching ONLY the child element and its children, it seems to still be searching from the root down.

I have the following code:

<?php

date_default_timezone_set('Australia/Sydney');
$url = "http://gdata.youtube.com/feeds/api/playlists/58FD3A7244B64B99?prettyprint=true&alt=atom&v2=1&fields=title,subtitle,logo,entry%28link%5B@rel=%27alternate%27%5D,id,title,content,author,yt:statistics%29";

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true );
$rawResponse = curl_exec($curl);

$xmlData = simplexml_load_string($rawResponse);
$xmlData->registerXPathNamespace('yt', 'http://gdata.youtube.com/schemas/2007');

foreach($xmlData->entry as $entry) {
    var_dump($entry->asXml());
    myFunction($entry); die();
}

function myFunction(SimpleXMLElement $xml)
{
    var_dump($xml->xpath("//yt:statistics"));
}

Rather than the expected:

string(666) "<entry>
                <id>http://gdata.youtube.com/feeds/api/playlists/58FD3A7244B64B99/PLlwIr0olq0UxVV_ouqclCE0xRZvs2Lytl</id>
                <title type="text">Zero Punctuation on The Escapist</title>
                <content type="text">Zero Punctuation picks apart the games so you don't have to. View new episodes every Wednesday only
at http://www.escapistmagazine.com</content>
                <link rel="alternate" type="text/html" href="http://www.youtube.com/watch?v=7EpzwuZOvKY&amp;feature=youtube_gdata"/>
                <author>
                        <name>theescapistmagazine</name>
                        <uri>http://gdata.youtube.com/feeds/api/users/theescapistmagazine</uri>
                </author>
                <yt:statistics favoriteCount="256" viewCount="188598"/>
        </entry>"
object(SimpleXMLElement)#5 (1) {
  ["@attributes"]=>
  array(2) {
    ["favoriteCount"]=>
    string(3) "256"
    ["viewCount"]=>
    string(6) "188598"
  }
}

I get:

string(666) "<entry>
                <id>http://gdata.youtube.com/feeds/api/playlists/58FD3A7244B64B99/PLlwIr0olq0UxVV_ouqclCE0xRZvs2Lytl</id>
                <title type="text">Zero Punctuation on The Escapist</title>
                <content type="text">Zero Punctuation picks apart the games so you don't have to. View new episodes every Wednesday only
at http://www.escapistmagazine.com</content>
                <link rel="alternate" type="text/html" href="http://www.youtube.com/watch?v=7EpzwuZOvKY&amp;feature=youtube_gdata"/>
                <author>
                        <name>theescapistmagazine</name>
                        <uri>http://gdata.youtube.com/feeds/api/users/theescapistmagazine</uri>
                </author>
                <yt:statistics favoriteCount="256" viewCount="188598"/>
        </entry>"
array(25) {
  [0]=>
  object(SimpleXMLElement)#5 (1) {
    ["@attributes"]=>
    array(2) {
      ["favoriteCount"]=>
      string(3) "256"
      ["viewCount"]=>
      string(6) "188598"
    }
  }
  [1]=>
  object(SimpleXMLElement)#6 (1) {
    ["@attributes"]=>
    array(2) {
      ["favoriteCount"]=>
      string(4) "4787"
      ["viewCount"]=>
      string(7) "1276435"
    }
  }
  [2]=>
  object(SimpleXMLElement)#7 (1) {
    ["@attributes"]=>
    array(2) {
      ["favoriteCount"]=>
      string(4) "7628"
      ["viewCount"]=>
      string(7) "1702845"
...

So, even though I'm work on a child element of the root element, why is xpath still searching the parent element? And more importantly, how can I search just the child element?

  • 写回答

1条回答 默认 最新

  • douyi3632 2012-03-12 03:54
    关注

    You have to remove the // from your expression as it backs up and then applies the expression to the entire document. What you're looking for is a single slash /, which starts from the root of the given document fragment.

    That should do the trick. :)

    edit: completely omitting the slash should do the trick as well.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 R语言卸载之后无法重装,显示电脑存在下载某些较大二进制文件行为,怎么办
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?
  • ¥15 关于#vue.js#的问题:修改用户信息功能图片无法回显,数据库中只存了一张图片(相关搜索:字符串)
  • ¥15 texstudio的问题,
  • ¥15 spaceclaim模型变灰色
  • ¥15 求一份华为esight平台V300R009C00SPC200这个型号的api接口文档
  • ¥15 字符串比较代码的漏洞
  • ¥15 欧拉系统opt目录空间使用100%
  • ¥15 ul做导航栏格式不对怎么改?