Что я делаю не так с xpath? - PullRequest
       0

Что я делаю не так с xpath?

5 голосов
/ 30 августа 2010

test.html

<html>
    <body>
        <span> hello Joe</span>
        <span> hello Bob</span>
        <span> hello Gundam</span>
        <span> hello Corn</span>
    </body>
</html>

PHP-файл

$doc = new DOMDocument();
$doc->loadHTMLFile("test.html");

$xpath = new DOMXPath($doc);

$retrieve_data = $xpath->evaluate("//span");

echo $retrieve_data->item(1);
var_dump($retrieve_data->item(1));
var_dump($retrieve_data);

Я пытаюсь использовать xPath, чтобы найти пролеты, а затем повторить их, но, похоже, я не могу их отобразить.Я попытался сбросить его, чтобы посмотреть, правильно ли оценивается, и я не уверен, что означает этот вывод:

object(DOMElement)#4 (0) { } 
object(DOMNodeList)#7 (0) { }

Что означают #4 и #7 и что означают скобки;Что означает синтаксис?

Обновление: эту ошибку я получаю, когда пытаюсь echo $retrieve_data; и $retrieve_data->item(1);

Catchable fatal error: Object of class DOMNodeList could not be converted to string

Ответы [ 4 ]

3 голосов
/ 30 августа 2010
$xpath->evaluate("//span");

возвращает типизированный результат, если это возможно, или DOMNodeList, содержащий все узлы, соответствующие данному выражению XPath.В вашем случае он возвращает DOMNodeList, потому что ваш XPath оценивается как четыре DOMElements, которые являются специализированными DOMNodes.Понимание концепции Node при работе с любым XML, независимо от того, на каком языке, имеет решающее значение.

echo $retrieve_data->item(1);

не может работать, потому что DOMNodeList::item возвращает DOMNode и, более конкретно, DOMElement в вашем случае.Вы не можете echo объекты любого вида в PHP, если они не реализуют метод __toString().DOMElement нет.Также не DOMNodeList.Следовательно, вы получаете фатальную ошибку, что объект не может быть преобразован в строку.

Чтобы получить значения DOMElement, вы либо читаете их nodeValue или textContent.

Некоторые примеры DOM, сделанные мной: https://stackoverflow.com/search?q=user%3A208809+dom

2 голосов
/ 30 августа 2010

Если вы хотите выводить текст внутри диапазона, вы можете использовать свойство textContent:

echo $ retrieve_data-> item (1) -> textContent;

1 голос
/ 30 августа 2010

ваш элемент как объект DOMNode, может помочь его свойство nodeValue

1 голос
/ 30 августа 2010

Если вы хотите вывести XML (точнее, HTML), попробуйте:

echo $doc->saveXML( $retrieve_data->item(1) );

Кстати, DOMNodeList, который является результатом вашего запроса, имеет нулевую базовую индексацию, поэтому первым элементом будет 0. Но, возможно, ты уже знал это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...