#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.