2009-09-11 5 views
0

J'utilise DOM pour analyser un fichier xml. Et j'ai du mal à attraper une erreur qui se produit lorsque la balise XML est vide et auto-fermée.PHP Dom XML Analyse des balises à fermeture automatique vides

par ex. <Title />

$xml=("http://www.example.com/xml-to-parse.xml"); 
$xmlDoc = new DOMDocument(); 
$xmlDoc->load($xml); 

$element = $xmlDoc->getElementsByTagName('Root'); 

for ($i=0; $i <= 10; $i++) 
{ 
    $id = $element->item($i)->getElementsByTagName('Title') 
        ->item(0)->childNodes->item(0)->nodeValue; 

L'erreur que je reçois est:

Essayer d'obtenir la propriété de non-objet

Répondre

2

Une balise vide ne va pas avoir de noeuds enfants, ainsi la Le deuxième élément (0) de votre dernière ligne ne renverra pas un objet valide, et donc tenter d'obtenir sa valeur via nodeValue va lancer l'erreur que vous obtenez car il n'a pas d'objet approprié à travailler.

+0

Merci, je pensais autant. Mon principal problème est de trouver un moyen de vérifier si la balise a des nœuds enfants. J'ai essayé "item (0) -> hasChildNodes" mais je n'ai pas eu de chance. Des idées? – JordanC

+1

Pourriez-vous ajouter le code que vous essayiez avec hasChildNodes? – Amber

+0

Peu importe, je l'ai résolu maintenant. J'ai enlevé le "childNodes-> item (0) ->" et cela fonctionne très bien. Merci pour votre aide! – JordanC

1

L'erreur XML que vous recevez n'est pas due à l'auto-fermeture de l'étiquette; c'est un XML valide. C'est probablement dû au fait de ne pas trouver une balise nommée Title, ou de ne pas en avoir 10 retournées (ce qui est une mauvaise façon de l'écrire, mieux vaut baser la boucle sur $ x-> length, qui est une valeur connue).

+1

Merci pour cette suggestion. Je l'ai changé pour X-> longueur mais l'erreur est toujours là. Mon problème est qu'il y a 10 items $ x différents à faire défiler et qu'un seul d'entre eux est vide avec l'étiquette de fermeture automatique. J'ai besoin d'un moyen de vérifier si la balise est vide. Seriez-vous en mesure d'aider du tout? – JordanC

+0

La fonction hasAttributes() vous indiquera s'il s'agit d'une balise vide (à fermeture automatique): http://us2.php.net/manual/en/domnode.hasattributes.php – scotts

+0

Correction: mon commentaire ci-dessus ne vous le dira pas S'il s'agit d'une balise * vide *, elle peut toujours contenir d'autres balises, elle vous dira simplement si elle a des attributs. hasChildNodes() vous dira s'il a des enfants. http://us2.php.net/manual/fr/domnode.haschildnodes.php – scotts