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());
    }

Надеюсь это поможет

Другие вопросы по тегам