Как выполнить запросы XPath к элементам DOME, используя PHP? - PullRequest
7 голосов
/ 08 мая 2011

Я пытаюсь выполнить запросы Xpath для элементов DOME, но, похоже, это не работает. Вот код

<html>
    <div class="test aaa">
        <div></div>
        <div class="link">contains a link</div>
        <div></div>
    </div>
    <div class="test bbb">
        <div></div>
        <div></div>
        <div class="link">contains a link</div>
    </div>
</html>

Что я делаю, это:

$dom = new DOMDocument();
$html = file_get_contents("file.html");
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$entries = $xpath->query("//div[contains(@class,'test')]");
if (!$entries->length > 0) {
    echo "Nothing\n";
} else {
  foreach ($entries as $entry) {
      $link = $xpath->query('/div[@class=link]',$entry);
      echo $link->item(0)->nodeValue;
      // => PHP Notice:  Trying to get property of non-object
  }
}

Все отлично работает до $xpath->query('/div[@class=link], $entry);. Я не знаю, как использовать Xpath для определенного элемента DOME ($ entry).

Как я могу использовать запросы xpath для DOMElement?

1 Ответ

7 голосов
/ 08 мая 2011

Похоже, вы пытаетесь смешать селекторы CSS с XPath.Вы хотите использовать предикат ([...]) для просмотра значения атрибута class.

Например, ваш //div.link может выглядеть как //div[contains(concat(' ',normalize-space(@class),' '),' link ')].

Во-вторыхвнутри цикла вы пытаетесь сделать запрос с контекстным узлом, а затем игнорируете его, используя абсолютный путь к местоположению (он начинается с косой черты).

Обновлено , чтобы отразить изменения в вопросе:

Ваше второе выражение XPath (/div[@class=link]) по-прежнему a) абсолютное и b) имеет неверное условие.Вы хотите запросить сопоставление элементов относительно указанного узла контекста ($entry) с атрибутом class, имеющим строковое значение из link.

Итак /div[@class=link]должен стать чем-то вроде div[@class="link"], который ищет дочерние элементы $entry (используйте .//div[...] или descendant::div[...], если вы хотите искать глубже).

...