2017-07-06 13 views
0

xpathに問題があります。私はこのからデータを取得しようとしている:PHP Xpath非オブジェクトのプロパティを取得しようとしています

<div class="clan__table"> 
     <div class="clan__headers"> 
     <div class="clan__headerCaption">Rank</div> 
     <div class="clan__headerCaption">Name</div> 
     <div class="clan__headerCaption">Level</div> 
     <div class="clan__headerCaption">League</div> 
     <div class="clan__headerCaption">Trophies</div> 
     <div class="clan__headerCaption">Donations</div> 
     <div class="clan__headerCaption">Role</div> 
     </div>  
     <div class="clan__rowContainer"> 
     <div class="clan__row"> 
          #2 
        </div> 
     <div class="clan__row"> 
      <a class="ui__blueLink" href='/profile/8C2PQYYL'>Voodoo</a> 
     </div> 
     <div class="clan__row"> 
      <span class="clan__playerLevel">11</span> 
     </div> 
     <div class="clan__row"> 
      <div class="clan__leagueContainer"> 
          <div class="league__1"></div> 
         </div> 
     </div> 
     <div class="clan__row"> 
      <div class="clan__cup">4000</div> 
     </div> 
     <div class="clan__row">96</div> 
     <div class="clan__row"> 
      Co-Leader 
        </div> 
     </div> 
.... 
.... 

これは私のコードです:ほとんどの作業

$xpath2 = new DOMXPath($doc2); 
$text = ""; 
$playerlist_ul = $xpath2->query("//div[@class='clan__table']")->item(0); 
$playernodes = $playerlist_ul->childNodes; 
if (!empty($playernodes)) 
{ 
    foreach ($playernodes as $node2) 
    { 
     if ($node2->hasChildNodes()) 
     { 

      $playerinfo = new DOMDocument(); 
      libxml_use_internal_errors(true); 
      $playerinfo->loadHTML($node2->ownerDocument->saveHTML($node2)); 
      $xpath3 = new DOMXPath($playerinfo); 


      $player['level'] = $xpath3->query("//span[@class='clan__playerLevel']")->item(0)-> 
       textContent; 
      $player['name'] = $xpath3->query("//a[@class='ui__blueLink']")->item(0)-> 
       textContent; 
      $player['id'] = $xpath3->query("//a[@class='ui__blueLink']/@href")->item(0)-> 
       textContent; 
      $player['trophy'] = $xpath3->query("//div[@class='clan__cup']")->item(0)-> 
       textContent; 
      $player['role'] = $xpath3->query("//div[@class='clan__row']")->item(6)-> 
       textContent; 
      $player['donate'] = $xpath3->query("//div[@class='clan__row']")->item(5)-> 
       textContent; 
      $player['clan_position'] = $xpath3->query("//div[@class='clan__row']")->item(0)-> 
       textContent; 


      $players[] = $player; 
     } 
    } 
} 

すべてが、私はエラーを取得:$でのすべての行に非オブジェクトのプロパティを取得しようとすると、どのようにこのエラーを回避するために:プレイヤーの[「....」] これは、[0] だから私の質問をされたアレイに何か問題があり

array (size=49) 
    0 => 
    array (size=6) 
     'level' => null 
     'name' => null 
     'trophy' => null 
     'role' => null 
     'donate' => null 
     'clan_position' => null 
    1 => 
    array (size=6) 
     'level' => string '11' (length=2) 
     'name' => string '/profile/8C2PQYYL' (length=17) 
     'trophy' => string '4056' (length=4) 
     'role' => string ' 
      Co-Leader 
        ' (length=44) 
     'donate' => string '192' (length=3) 
     'clan_position' => string ' 
          #1 
        ' (length=52) 

なるのですか?

答えて

1

DOMXpath::query()は常にDOMNodeListインスタンスを返します。そのリストからノードを取得し、その$textContentプロパティにアクセスしています。ここにノードがない場合、エラーが発生します。

DOMXpath::evaluate()を使用すると簡単に解決できます。 Xpath式では型キャストが可能ですが、DOMXpath::evaluate()のみがスカラー戻り値をサポートします。

基本的に、ノードリストを返す式にはforeach()を使用し、その詳細には型キャスト付きの式を使用します。フラグメントを保存して別のドキュメントとしてロードする必要はありません。式のコンテキストノードを提供できます。

$document = new DOMDocument(); 
$document->loadHtml($html); 
$xpath = new DOMXpath($document); 

$expression = "//div[@class='clan__table']/div[@class='clan__rowContainer']"; 
foreach ($xpath->evaluate($expression) as $clanNode) { 
    $result = [ 
    'level' => $xpath->evaluate("string(.//span[@class='clan__playerLevel'])", $clanNode), 
    'name' => $xpath->evaluate("string(.//a[@class='ui__blueLink'])", $clanNode), 
    'id' => $xpath->evaluate("string(.//a[@class='ui__blueLink']/@href)", $clanNode), 
    'trophy' => $xpath->evaluate("string(.//div[@class='clan__cup'])", $clanNode), 
    'role' => $xpath->evaluate("string(.//div[@class='clan__row'][7])", $clanNode), 
    'donate' => $xpath->evaluate("string(.//div[@class='clan__row'][6])", $clanNode), 
    'clan_position' => $xpath->evaluate(
     "normalize-space(.//div[@class='clan__row'][1])", $clanNode 
    ) 
    ]; 
    var_dump($result); 
} 

出力:

array(7) { 
    ["level"]=> 
    string(2) "11" 
    ["name"]=> 
    string(6) "Voodoo" 
    ["id"]=> 
    string(17) "/profile/8C2PQYYL" 
    ["trophy"]=> 
    string(4) "4000" 
    ["role"]=> 
    string(46) " 
      Co-Leader 
        " 
    ["donate"]=> 
    string(2) "96" 
    ["clan_position"]=> 
    string(2) "#2" 
} 

のXpath string()について少しは明示的な型キャストです。リストの最初のノードのテキスト内容または空の文字列を返します。 normalize-space()には暗黙の型キャストが含まれていますが、削除すると文字列がトリミングされ、すべての空白グループが単一のスペースに置き換えられます。 [6]はノードリストの6番目の要素です。

関連する問題