XPath: получить значение с использованием относительного пути (PHP, Symfony, DOMCrawler) ошибка
Я пишу тест для проверки моего понимания XPath с помощью Symfony DomCrawler:
$crawler = new Crawler();
$crawler->add('<foo><foo>bar</foo></foo>');
$crawlerWithNodes = $crawler->filterXPath('/foo/foo');
$this->assertEquals('bar', $crawlerWithNodes->text());
Но вышесказанное приводит к:
InvalidArgumentException: текущий список узлов пуст.
Онлайн:
$ this-> assertEquals ('bar', $ crawlerWithNodes-> text ());
Что я делаю неправильно?
1 ответ
Вам нужно загрузить контент как DOMDocument
вместо простой строки (интерпретируется как HTML).
Вам также необходимо добавить префикс _root в строку xpath, если вы хотите найти абсолютный путь в структуре. Увидеть Symfony\Component\DomCrawler\Tests\CrawlerTest
cass для дальнейшего примера (метод testFilterXpathComplexQueries)
Рассмотрим следующий метод испытаний:
public function testCrawlerAsHtml()
{
$crawler = new Crawler();
$crawler->add('<html><body><foo><foo>bar</foo></foo></body></html>');
//die(var_dump($crawler->html()));
$crawlerWithNodes = $crawler->filterXPath('/_root/html/body/foo/foo');
$this->assertEquals('bar', $crawlerWithNodes->text());
}
public function testCrawlerAsDomElement()
{
$dom = new \DOMDocument();
$dom->loadXML('<foo><foo>bar</foo></foo>');
$crawler = new Crawler();
$crawler->add($dom);
// die(var_dump($crawler->html()));
$crawlerWithNodes = $crawler->filterXPath('/_root/foo/foo');
$this->assertEquals('bar', $crawlerWithNodes->text());
}
Надеюсь это поможет