DomXML xpath, что мне делать дальше?

У меня есть этот код:

$reader = new DOMDocument();
$reader->loadHTML($shell);
$xpath = new DomXPath($reader);
$xpath->registerNamespace('html','http://www.w3.org/1999/xhtml');
$res = $xpath->query('descendant-or-self::*[contains(@class,"content")]');
print_r($res);

$shell — это просто переменная, содержащая следующий HTML-код:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
        <meta http-equiv="Content-Language" content="en-us" />

        <title>Hello World</title>
    </head>

    <body>
        <div class="content">
            Hello World!!
        </div>
    </body>
</html>

Если я прав, запрос xpath:

descendant-or-self::*[contains(@class,"content")]

предполагается получить div с классом «контент». Однако, когда я печатаю массив, все, что я вижу, это пустой объект:

DOMNodeList Object
(
)

Значит ли это, что запрос не сработал? Отличается ли язык запросов DomXPath от языка SimpleXML Xpath, потому что запрос работает с SimpleXML?

Если он работает, как просмотреть и изменить совпадающие узлы?


person Franky Chanyau    schedule 22.09.2010    source источник


Ответы (2)


print_r - использование DOMNodeList (или любого из DOM-классов) не принесет вам много пользы: они в основном реализованы на уровне C/Libxml2 и изначально не доступны для PHP. Насколько я могу судить, это будет работать, добавьте это после вашего запроса и посмотрите, получите ли вы результаты:

foreach($res as $node){
        var_dump($node->ownerDocument->saveXML($node));
}
person Wrikken    schedule 22.09.2010
comment
Спасибо, запрос работает. Итак, как мне тогда редактировать атрибуты и данные совпадающих узлов? - person Franky Chanyau; 23.09.2010
comment
Я бы сказал, посмотрите спецификацию DOMElement на php.net/manual/en /class.domelement.php, вы, вероятно, ищете функцию setAttribute, свойство childNodes (также DOMNodeList), nodeValue и т. д. К API нужно привыкнуть, но по большей части это согласованный API, поэтому любой учебник по DOM (PHP или другой), скорее всего, даст вам хорошее представление о его работе (и проверьте комментарии в руководстве по PHP). - person Wrikken; 23.09.2010

Я думаю, вы хотите что-то вроде этого:

//*[@class='content']

Это получит любой тег с содержимым класса.

Будет немного читабельнее просто получить любой div:

//div[@class='content']

В xpath вы используете оператор // для захвата тега на любом уровне в dom. Он будет соответствовать им всем.

person Byron Whitlock    schedule 22.09.2010