2010-07-20 5 views
0

다음 PHP 코드 : 나는 그것에을 기대하는 것처럼SimpleXML을하고 PHP XPath 식은 올바른 데이터를 반환하지

<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)"> 

대신 빈 배열이 나타납니다.

다음은 페이지의 전체 URL http://eu.wowarmory.com/character-achievements.xml?r=Sunstrider&cn=Secrezy&c=168

감사합니다!

편집 : xpath를/achievements/category/achievement [@ id = '4602']로 변경 한 후 완전히 빠진 모든 것이 잘 작동합니다. 고마워. 그러나이를 원래 코드로 구현하면 여전히 예상대로 작동하지 않습니다. 끔찍한 일을하고 있다고 확신합니다. 도움을 주셔서 감사합니다. xmlraid의 위해서 var_dump 만이 ($ 난으로 인해 다수의 많은 시간) 생산하고

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

:

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 매우 새로 온 것을 추가해야합니다 그래서 내 코드가 잘되지 않습니다.

+1

나는 완전히 다른 태그를 얻고있다. (클래스 이름을 가진 div). 거기에 뭔가를 사용하려고하는 XML을보기 위해 보내야 할 것이 있습니까? – Wrikken

+0

@Wrikken : 어느 브라우저를 사용하십니까? XSL 스타일 시트가 자동으로 적용될 수 있습니다. Firefox 3.6에서 소스를 보면 XML을 볼 수 있습니다. –

+0

Hmmm, nope (opera), XSL을 사용할 수 있습니다. 그러나 FF로 시도해 보겠습니다. – Wrikken

답변

0

아니요, 확인 the doc. simplexml_load_file()은 XML을 나타내는 객체를 $xmlraid으로 반환합니다. var_dump($xmlraid);을하고 xpath 표현식을 확인하는 것이 좋습니다.

2

는 XPath는 있어야하지 :

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

또는 :

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

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

업데이트 :

그 코드와 문제는 당신이 추가되었다는 사실은 $array에 각 이름 끝에 <br />을 입력하십시오. 일반적으로 정당한 이유가있는 경우가 아니라면 이러한 방식으로 서식을 추가하지 마십시오.

또한 메모에 내 메모를 유의하십시오. 특히, 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>'; 
} 
+0

+1 예, 루트 요소가 누락되었습니다. –

+0

조지 감사합니다. – James

0

문서 요소 achievements이다.

귀하의 XPATH 문은 다음과 같아야합니다

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

젠장은, 그 사람들은 불쾌한 브라우저 스니퍼입니다.그래도 난 헛되이 다하지 않았다,이 작품 :

<?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입니다. 브라우저 스니핑이 나에게 나쁜 영향을주는 훌륭한 사례.

+0

감사합니다. 실제로 첫 번째 게시물로 편집 한 원래 코드에 사용자 에이전트가 있습니다. simplexml_load_file은 while 루프로 구현하지 않으면 작동하지 않는 것 같습니다 ... – James

관련 문제