【问题标题】:SimpleXML and PHP XPath expression not returning correct dataSimpleXML 和 PHP XPath 表达式未返回正确的数据
【发布时间】:2010-07-20 23:32:06
【问题描述】:

以下PHP代码:

<html>
<?php


$name = Secrezy;
$server = Sunstrider;

 $raidurl='http://eu.wowarmory.com/character-achievements.xml?r='.$server.'&cn='.$name.'&c=168';
 print_r($raidurl); // This is to check if the link is valid. Follow the link printed here and you should find a valid XML page
 echo "<br>"; 
 $xmlraid = simplexml_load_file($raidurl);
 $achievement = array($xmlraid->xpath("/category/achievement[@id='4602']"));  
 print_r($achievement);

?>
</html>

没有像我期望的那样工作。 $achievement 不应该用这个填充:

<achievement categoryId="168" dateCompleted="2010-03-26T00:01:00+01:00" desc="Complete the 10-player raid achievements listed below." icon="inv_helmet_74" id="4602" points="25" reward="Reward: Bloodbathed Frostbrood Vanquisher" title="Glory of the Icecrown Raider (10 player)">

相反,我只得到一个空数组。

这是http://eu.wowarmory.com/character-achievements.xml?r=Sunstrider&cn=Secrezy&c=168页面的完整网址

谢谢!

编辑:将 xpath 更改为我完全错过的 /achievements/category/achievement[@id='4602'] 后,一切正常。所以谢谢你。但是,如果我将它实现到我的原始代码中,它仍然不能像我预期的那样工作。我确定我做错了什么,所以感谢您的帮助。

<?php
echo "<html>
 <head>
  <title>ARMORY.</title>
  <meta http-equiv='Content-Type' content='text/html' charset=iso-8859-1>
 </head>
 <body>
 <table width='50%' border='1' cellpadding='10' cellspacing='10'>";
ini_set("user_agent", "Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/20121223 Ubuntu/9.25 (jaunty) Firefox/3.8");

$server = "Sunstrider";
$guild = "Operation+Eskimo";

$url='http://eu.wowarmory.com/guild-info.xml?r='.$server.'&gn='.$guild;
$xml = simplexml_load_file($url);



$array = array();



foreach($xml->guildInfo->guild->members->character as $char)
  if(strtolower($char['level']) === '80')
  {
        $array[] = $char['name']."<br />";
  } 

$i = 0;
while($array[$i] != null) 
{
 $name = $array[$i];
 $raidurl='http://eu.wowarmory.com/character-achievements.xml?r='.$server.'&cn='.$name.'&c=168';
 $xmlraid = simplexml_load_file($raidurl);
 var_dump($xmlraid);
 echo "<br><br>";
 $achievement = array($xmlraid->xpath("/achievements/category/achievement[@id='4602']")); 
    $i++; 
}


?>

 </body>
</html>

xmlraid 的 var_dump 只产生这个(很多次由于 $i):

object(SimpleXMLElement)#3 (2) { ["@attributes"]=>  array(2) { ["lang"]=>  string(5) "en_us" ["requestUrl"]=>  string(27) "/character-achievements.xml" } ["category"]=>  object(SimpleXMLElement)#2 (1) { ["category"]=>  array(12) { [0]=>  object(SimpleXMLElement)#5 (0) { } [1]=>  object(SimpleXMLElement)#6 (0) { } [2]=>  object(SimpleXMLElement)#7 (0) { } [3]=>  object(SimpleXMLElement)#8 (0) { } [4]=>  object(SimpleXMLElement)#9 (0) { } [5]=>  object(SimpleXMLElement)#10 (0) { } [6]=>  object(SimpleXMLElement)#11 (0) { } [7]=>  object(SimpleXMLElement)#12 (0) { } [8]=>  object(SimpleXMLElement)#13 (0) { } [9]=>  object(SimpleXMLElement)#14 (0) { } [10]=>  object(SimpleXMLElement)#15 (0) { } [11]=>  object(SimpleXMLElement)#16 (0) { } } } 

我应该补充一点,我对 PHP 很陌生,所以我的代码不是很好。

【问题讨论】:

  • 我得到了你正在寻找的其他标签(带有类名的div)。我们应该发送其他东西来查看您尝试使用的 XML 吗?
  • @Wrikken:您使用哪种浏览器?可能是自动应用了 XSL 样式表。如果我在 Firefox 3.6 中看到源代码,我可以看到 XML。
  • 嗯,不(歌剧),它可以使用 XSL。但我会尝试FF
  • 用IE浏览页面,你会看到XML。 (好吧,当你查看源代码时,你会的。)我不确定 FF,但 Chrome 要么触发一些“你的浏览器糟透了”开关,要么甚至在“查看源代码”查看它之前转换 XML。在这种情况下,IE 实际上比 Chrome 运行得更好。
  • 嗯,即使wget 也得到了转换的东西......

标签: php xml simplexml xpath


【解决方案1】:

xpath 不应该是:

/achievements/category/achievement[@id='4602']

或者:

//category/achievement[@id='4602']

http://www.w3schools.com/xpath/xpath_syntax.asp

更新:

该代码的问题在于您将&lt;br /&gt; 添加到$array 中每个名称的末尾。一般来说,除非有充分的理由,否则请避免以这种方式添加格式。

另外,请注意我在 cmets 中的笔记。特别是urlendcode()。我把这个留给你处理$url,因为直到开始编辑之后我才注意到它,而且我很懒。 ;) 请注意,一旦你通过urlencode() 传递这些查询字符串参数,公会名称中的+ 就不是必需的,它实际上会妨碍。

ini_set("user_agent", "Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/20121223 Ubuntu/9.25 (jaunty) Firefox/3.8");

$server = "Sunstrider";
$guild = "Operation+Eskimo";

$url='http://eu.wowarmory.com/guild-info.xml?r='.$server.'&gn='.$guild;
$xml = simplexml_load_file($url);

$array = array();

foreach ($xml->guildInfo->guild->members->character as $char)
{
    if (strtolower($char['level']) === '80')
    {
        $array[] = $char['name'];
    }
}

foreach ($array as $i => $name)
{
// note that this if statement and $i in the foreach are only here to limit this to 1 for testing, the full list spews out A LOT of data and takes A LONG time
if ($i) 
{
exit;
}
    // note the urlencode() call, that's important
    $raidurl='http://eu.wowarmory.com/character-achievements.xml?r=' . urlencode($server) . '&cn=' . urlencode($name) . '&c=168';
    $xmlraid = simplexml_load_file($raidurl);

    // note the pre tags around var_dump, makes things easier to read in the browser
    // also note print instead of echo, I lke to do this for debugging, as it makes 
    // it easier to determine what's is debug output for those long running debugging sessions
    print '<pre>';
    var_dump($xmlraid);
    print '</pre>';
     echo "<br><br>";

    // quick and dirty solution for viewing the XML
    /*print '<textarea cols="400" rows="2000">';
    print $xmlraid->asXML();
    print '</textarea>';*/

    $achievement = $xmlraid->xpath("/achievements/category/achievement[@id='4602']");

    print '<pre>';
    var_dump($achievement);
    print '</pre>';
}

【讨论】:

    【解决方案2】:

    不,请检查the doc。 simplexml_load_file() 将表示 XML 的对象返回到 $xmlraid。我建议做一个var_dump($xmlraid); 并验证您的 xpath 表达式。

    【讨论】:

      【解决方案3】:

      文档元素是achievements

      您的 XPATH 语句应该是:

      /achievements/category/achievement[id='4602']
      

      【讨论】:

        【解决方案4】:

        该死,那些人是讨厌的浏览器嗅探器。不过,我并没有徒劳地做这一切,这是可行的:

        <?php
        $opts = array(
            'http' => array(
                'header' => 'User-Agent: Firefox/3.5.9\r\n'
            )
        );
        $context = stream_context_create($opts);
        libxml_set_streams_context($context);
        
        $d = simplexml_load_file('http://eu.wowarmory.com/character-achievements.xml?r=Sunstrider&cn=Secrezy&c=168');
        var_dump($d->xpath("//achievement[@id='4602']"));
        

        __extremely_ 可悲的是,起初我只是希望它至少是 Accept 或最多 Accept-Encoding - 标题。但是不,“不应该意味着任何重要的东西”-User-Agent-header。一个很好的例子,为什么我曾经见过浏览器嗅探是不好的。

        【讨论】:

        • 谢谢。实际上,我的原始代码中确实有用户代理,我现在已将其编辑到第一篇文章中。 simplexml_load_file 现在似乎可以工作,除非我尝试将它实现到 while 循环中......
        猜你喜欢
        • 1970-01-01
        • 2012-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多