2010-09-22 4 views
0

У меня есть этот код: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); 

$ оболочки это просто переменная, содержащая следующий 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?

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

ответ

2

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

foreach($res as $node){ 
     var_dump($node->ownerDocument->saveXML($node)); 
} 
+0

Спасибо, запрос работает. Итак, как я мог бы сейчас приступить к редактированию атрибутов и данных согласованных узлов? –

+0

Я бы сказал, посмотрите на спецификацию 'DOMElement' по адресу http://www.php.net/manual/en/class.domelement.php, вы, вероятно, ищете функцию setAttribute,' childNodes' (также DOMNodeList), 'nodeValue' и т. д. API немного привыкает, но по большей части является согласованным API, поэтому любой DOM-праймер (PHP или иначе), скорее всего, даст вам хорошее представление в его работе (и проверить комментарии в руководстве PHP). – Wrikken

0

Я имею в виду, вы хотите somthiing как это:

//*[@class='content']

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

Это будет немного более удобным для чтения, чтобы просто получить любой DIV:

//div[@class='content']

В XPath используется оператор //, чтобы захватить тег на любом уровне в йот. Это будет соответствовать всем этим.

Смежные вопросы