2010-09-22 6 views
0

J'ai ce code:DomXML xpath que dois-je faire ensuite?

$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 $ est juste une variable contenant le code html suivant:

<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> 

Si je ne me trompe pas la requête XPath:

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

est censé obtenir le div avec la classe "contenu". Cependant, lorsque j'imprime le tableau tout ce que je vois est un objet vide:

DOMNodeList Object 
(
) 

Est-ce que cela signifie que le travail na pas de requête? Le langage de requête DomXPath est-il différent de celui de SimpleXML Xpath, car la requête fonctionne avec SimpleXML?

Si cela fonctionne, comment afficher et modifier les nœuds correspondants?

Répondre

2

print_r - ou (ou l'une des classes DOM) ne vous fait pas grand chose: elles sont principalement implémentées au niveau C/Libxml2, et non nativement exposées à PHP. Pour autant que je peux dire, cela fonctionnera, ajouter ceci après votre requête, et voir si vous obtenez des résultats:

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

Merci, La recherche fonctionne. Alors, comment puis-je modifier les attributs et les données des nœuds correspondants? –

+0

Je dirais de regarder la spécification de 'DOMElement' sur http://www.php.net/manual/en/class.domelement.php, vous cherchez probablement la fonction' setAttribute', 'childNodes' propriété (aussi un DOMNodeList), le 'nodeValue' etc. L'API prend un peu de temps pour s'y habituer, mais c'est en grande partie l'API convenue, donc n'importe quelle amorce DOM (PHP ou autre) vous donnerait probablement un bon aperçu dans son fonctionnement (et vérifiez les commentaires dans le manuel PHP). – Wrikken

0

Je vous veux somthiing pense comme ceci:

//*[@class='content']

Cela obtenir toute étiquette avec le contenu de classe.

Il sera un peu plus lisible pour obtenir juste le tout div:

//div[@class='content']

En XPath, vous utilisez l'opérateur // pour saisir une étiquette à tous les niveaux dans le Royaume. Cela va les égaler tous.

Questions connexes