xpath не возвращает значения

#php #xpath #foreach #simplexml

#php #xpath #foreach #simplexml

Вопрос:

Я могу извлечь необходимую информацию с помощью xpath, когда я использую var_dump следующий код. Когда я пытаюсь добавить цикл foreach для возврата всех ["href"] значений, я получаю пустую страницу, есть идеи, где я ошибаюсь?

 $dom = new DOMDocument();
@$dom->loadHTML($source);
$xml = simplexml_import_dom($dom);
$rss = $xml->xpath("/html/body//a[@class='highzoom1']");

$links = $rss->href;

foreach ($links as $link){ 
    echo $link; 
    }
  

Вот массив информации.

 array(96) {
  [0]=>
  object(SimpleXMLElement)#3 (2) {
    ["@attributes"]=>
    array(2) {
      ["href"]=>
      string(49) "/p/18351/test1.html"
      ["class"]=>
      string(10) "highzoom1"
    }
    [0]=>
    string(36) ""test1"
  }
  [1]=>
  object(SimpleXMLElement)#4 (2) {
    ["@attributes"]=>
    array(2) {
      ["href"]=>
      string(43) "/p/18351/test2.html"
      ["class"]=>
      string(10) "highzoom1"
    }
    [0]=>
    string(30) ""test2"
  }
  [2]=>
  object(SimpleXMLElement)#5 (2) {
    ["@attributes"]=>
    array(2) {
      ["href"]=>
      string(48) "/p/18351/test3.html"
      ["class"]=>
      string(10) "highzoom1"
    }
    [0]=>
    string(35) ""test3"
  }
  

Комментарии:

1. не могли бы вы, пожалуйста, опубликовать содержимое исходного XML для справки?

2. Хороший вопрос, 1. Смотрите мой ответ для короткого и простого однострочного решения XPath 🙂

Ответ №1:

Вместо:

 $rss = $xml->xpath("/html/body//a[@class='highzoom1']");
  

использовать:

 $hrefs = $xml->xpath("/html/body//a[@class='highzoom1']/@href");
  

Используемое вами исходное выражение XPath (первое из приведенных выше) выбирает любой a элемент в XML-документе, значением class атрибута которого является 'highzoom1' и который ( a элемент) является потомком body , который является дочерним элементом верхнего элемента (именованного html ) в XML-документе.

Однако вы хотите выбрать href атрибуты этих a элементов, а не сами a элементы.

Во втором приведенном выше выражении XPath точно выбираются href атрибуты этих a элементов.

Комментарии:

1. ваш пример привел меня array(0) { } , когда я использовал var_dump ($ hrefs);

2. @sarsar: Если это так, это означает, что Simple XML не соответствует движку XPath. Я могу помочь вам с XPath, но не с несоответствующими реализациями XPath. Пожалуйста, повторно отметьте и удалите тег «xpath» и добавьте тег «simplexml».

3. @sarsar: рад это слышать. 🙂

Ответ №2:

 $links = $rss->href;
  

никогда не будет работать, поскольку $rss является объектом DOMNodeList и не будет иметь атрибута href. Вместо этого вы хотели бы сделать это:

 $rss = $xml->xpath("/html/body//a[@class='highzoom1']");

foreach($rss as $link) {
    echo $link->href;
}
  

Или вы можете обратиться к $rss напрямую как к массиву:

 echo $rss[5]->href; // echo out the href of the 6th link found.