2010-08-02 7 views
7

Un peu nouveau pour l'analyse PHP ici, mais je n'arrive pas à obtenir le DomDocument de PHP pour retourner ce qui est clairement un nœud identifiable. Le code HTML chargé viendra de la « net ne peut donc pas garantir nécessairement la conformité XML, mais je les opérations suivantes:PHP HTML DomDocument Problèmes getElementById

<?php 
header("Content-Type: text/plain"); 

$html = '<html><body>Hello <b id="bid">World</b>.</body></html>'; 

$dom = new DomDocument; 
$dom->preserveWhiteSpace = false; 
$dom->validateOnParse = true; 

/*** load the html into the object ***/ 
$dom->loadHTML($html); 
var_dump($dom);  

$belement = $dom->getElementById("bid"); 
var_dump($belement); 

?> 

Bien que je ne reçois aucune erreur, je reçois seulement ce qui suit en sortie:

object(DOMDocument)#1 (0) { 
} 
NULL 

Ne devrais-je pas être en mesure de rechercher la balise <b>, car elle possède en effet un identifiant?

Répondre

17

The Manual explique pourquoi:

Pour que cette fonction fonctionne, vous devrez soit pour définir certains attributs ID avec DOMElement-> setIdAttribute() ou une DTD qui définit un attribut comme étant de type ID. Dans le dernier cas, vous devrez valider votre document avec DOMDocument-> validate() ou DOMDocument-> validateOnParse avant d'utiliser cette fonction.

Par tous les moyens, allez pour un code HTML valide & fournissez une DTD.

Corrections rapides:

  1. Appel $dom->validate(); et mis en place avec les erreurs (ou les fixe), vous pouvez ensuite utiliser $dom->getElementById(), quelles que soient les erreurs pour une raison quelconque.
  2. Utilisez XPath si vous ne vous sentez pas comme validing: $x = new DOMXPath($dom); $el = $x->query("//*[@id='bid']")->item(0);
  3. Venez y penser: si vous venez de validateOnParse à true avant charger le code HTML, si fonctionne également; P

.

$dom = new DOMDocument(); 
$html ='<html> 
<body>Hello <b id="bid">World</b>.</body> 
</html>'; 
$dom->validateOnParse = true; //<!-- this first 
$dom->loadHTML($html);  //'cause 'load' == 'parse 

$dom->preserveWhiteSpace = false; 

$belement = $dom->getElementById("bid"); 
echo $belement->nodeValue; 

Sorties «Monde» ici.

+0

J'ai effectivement validateOnParse. setIdAttribute ne s'appliquerait qu'à set, puis à la récupération suivante? Encore une fois cependant, le HTML sera fourni sur le Web, donc je suis à leur merci, mais juste en essayant un exemple. HTML5 n'a même pas de DTD, oui? – Xailor

+0

"setIdAttribute ne s'appliquerait qu'à l'ensemble, puis à la récupération ultérieure?" -> Oui. HTML5 n'est pas encore terminé, donc il ne devrait pas encore avoir de DTD. –

+0

La DTD serait '', mais l'appel de '$ dom-> validate()' fonctionnerait aussi.Mettre en place avec les erreurs ou essayer de générer du HTML valide (ce dernier est plus difficile qu'il n'y paraît ... :)) – Wrikken

3

Eh bien, vous devriez vérifier si $dom->loadHTML($html); renvoie true (succès) et je voudrais essayer

var_dump($belement->nodeValue); 

pour la sortie pour obtenir une idée de ce qui pourrait être erroné.

EDIT: http://www.php-editors.com/php_manual/function.domdocument-get-element-by-id.html - il semble que DomDocument utilise XPath en interne.

Exemple:

$xpath = xpath_new_context($dom); 
var_dump(xpath_eval_expression($xpath, "//*[@ID = 'YOURIDGOESHERE']")); 
+0

Message original modifié pour refléter ces sorties. Merci, – Xailor