9
votes

Comment obtenir un enfant de PHP Domdocument par index

J'essaie d'obtenir un enfant d'un Domdocument PHP. Dis que j'ai un document DOM comme ceci: xxx

J'ai un numéro d'index 3. Puis j'ai besoin d'obtenir l'élément

< / code>. Dans l'API Domdocument, il n'y a pas de méthode comme enfants (3) . Y a-t-il? Comment puis-je obtenir un enfant avec un index?

4 commentaires

Vous devez utiliser GetElementyTag ('div'), puis utilisez la getattribute ('Class') et mettez-la dans si la condition correspond à la classe = 'Test'. Cela nécessite un peu de RND


(liée) meilleures méthodes pour analyser HTML et NOOB Question sur Domdocument à PHP


Dupliqué possible de Comment obtenir le premier niveau d'éléments DOM par DOMDocument Php?


@ Gordon.Je suis en train d'utiliser HTML DOM Parser. Mais cela ne semble pas robuste lorsque le document est grand. Je vais regarder ces post que vous vous référez à vous-même.


4 Réponses :


5
votes

Si vous utilisez DOMDocument, vous pouvez utiliser getelementsbytagname ('*') qui retourne un domnodeliste avec tous les éléments de votre document. Vous pouvez ensuite appeler la fonction item qui prend un index sous forme de paramètre: xxx


1 commentaires

Bonjour, merci pour la réponse, votre solution obtient tout l'élément de tous les nœuds descendantes. et toutes les balises HTML sont rayées. Mon intention est d'obtenir un niveau d'enfant par niveau avec une série d'index comme 1 3 4 0. J'espère que cela est clair.



1
votes

Essayez ceci

 foreach($dom->getElementsByTagName('div') as $div) { 
        $class = $div->getAttribute('class');
    } 


0 commentaires

19
votes

vous peut utiliser enfantNODES . Il s'agit d'une propriété d'un élément DOM contenant une nodéliste contenant tous les enfants de l'élément. Idéalement, vous seriez capable de faire € el-> enfantNodes-> item (2) (notez qu'il est basé sur 0, pas à 1 fois, 2 est le troisième élément). Cependant, cela inclut les nœuds de texte. Il est donc difficile de prédire quel numéro votre noeud sera. Ce n'est probablement pas la meilleure solution.

Vous pouvez aller avec La solution d'Alexn ( getelementsbytagname ('*') -> élément (2) ), mais à nouveau, cela a ses inconvénients. Si vos nœuds ont des nœuds d'enfants, ils seront également inclus dans la sélection. Cela pourrait lancer votre calcul.

Ma solution préférée serait d'utiliser XPath: c'est probablement la solution la plus stable, et pas particulièrement difficile.

Vous aurez besoin d'avoir créé un Objet XPath avec $ xpath = nouveau DOMXPATH ($ document) quelque part, où $ document est votre instance DOMDocument. Je vais supposer que £ el est le noeud parent div, le "contexte" que nous recherchons dans. xxx

note que Encore une fois, nous utilisons un index à base de 0 pour trouver quel élément de la sélection est. Ici, nous examinons les noeuds d'enfants du haut niveau div uniquement et * sélectionne uniquement les nœuds d'élément, de sorte que les calculs avec des nœuds de texte sont inutiles.


2 commentaires

Bonjour, merci de votre réponse. J'ai essayé $ el-> enfant-> article (2). Il a rayé toutes les balises HTML. J'ai aussi essayé $ x-> Query ('/ div / *', $ el) -> élément (2); mais remarquez que le nœud enfant n'est pas corrigé avec div ... j'ai besoin de dynamiser pour obtenir un niveau d'enfant par Niveau bas avec un indice de série comme 1 3 4 0.


@Yijie Oui, il aurait dû être juste Query ('*', $ el) . Voir la réponse mise à jour.



1
votes

Essayez ceci:

$dom->childNodes->item(3)


0 commentaires