2010-11-24 6 views
1

Mon but est de demander sur une structure xml, en utilisant une seule évaluation XPath, afin d'obtenir une liste de chaînes contenant la concaténation de text3 et text5 pour chaque div "my_class".Comment obtenir une liste de nœuds de texte concaténés

L'exemple de structure est donnée ci-dessous:

<div> 
    <div> 
     <div class="my_class"> 
      <div class="my_class_1"></div> 
      <div class="my_class_2">text2</div> 
      <div class="my_class_3"> 
       text3 
       <div class="my_class_4">text4</div> 
       <div class="my_class_5">text5</div> 
      </div> 
     </div> 
     <div class="my_class_6"></div> 
    </div> 
    <div> 
     <div class="my_class"> 
      <div class="my_class_1"></div> 
      <div class="my_class_2">text12</div> 
      <div class="my_class_3"> 
       text13 
       <div class="my_class_4">text14</div> 
       <div class="my_class_5">text15</div> 
      </div> 
     </div> 
    </div> 
</div> 

Cela signifie que je veux obtenir cette liste des résultats:
- dans l'indice 0 => text3 text5
- dans l'index 1 => text13 text15

Actuellement, je ne peux obtenir que les nœuds my_class, mais avec le text12 que je veux exclure; ou une liste de chaque chaîne, non concaténée.

Comment j'ai pu procéder?

Merci d'avance pour votre aide.

EDIT: Je retire text4 et text14 de ma recherche pour être exact dans mon exemple

Répondre

1

EDIT: Maintenant, la question a changé ...

XPath 1.0: Il n'y a pas chose comme "liste de chaînes" type de données. Vous pouvez utiliser cette expression pour sélectionner tous les éléments de conteneur des noeuds de texte que vous souhaitez:

/div/div/div[@class='my_class']/div[@class='my_class_3'] 

Et puis obtenir avec la méthode DOM appropriée de votre langue hôte la valeur de chaîne de chacun de ces éléments sélectionnés (la concaténation de tous les nœuds texte descendant) les nœuds de texte que vous voulez et descendat concaténer leur valeur de chaîne avec la XPath appropriée relative ou méthode DOM:

text()[1]|div[@class='my_class_5'] 

XPath 2.0: Il est aussi type de données equence.

/div/div/div[@class='my_class'] 
      /div[@class='my_class_3'] 
       /concat(text()[1],div[@class='my_class_5']) 
+0

Cela signifie-t-il qu'il est impossible d'obtenir plusieurs contenus textuels dans les nœuds frères, sauf l'un d'entre eux, en une seule réponse? – carpediem

+0

@carpediem: XPath sélectionne les nœuds.Vous pouvez sélectionner tous les nœuds de texte de votre choix, mais votre résultat sera un ensemble de nœuds (pas une relation de "concaténation" entre eux). Mon chemin sélectionne ** chaque conteneur ** des nœuds de texte que vous voulez, pas un seul. –

+0

@Alejandro & @Paul: Ok. Après quelques tests, cela fonctionne. J'ai déjà essayé cette fonction mais mon erreur était finalement de savoir comment récupérer le jeu de résultats. J'ai dû changer de caste dans ce cas. Merci à tous pour votre aide. – carpediem

0

Pourriez-vous pas seulement utiliser:

//my_class/my_class_3 

Et puis obtenir le .innerText de cela? Il pourrait y avoir un peu de nettoyage d'espacement à faire mais il devrait contenir tout le texte intérieur (y compris celui de la classe 4 et 5) mais sans les balises.


Edit: Après clairification

concat(/div/div/div[@class=my_class]/div[@class=my_class_3]/text(), ' ', /div/div/div[@class=my_class]/div[@class=my_class_5]/text()) 

Cela pourrait fonctionner

+0

oui. tu as tout à fait raison. J'ai essayé un peu de temps pour construire mon exemple et je réalise qu'il ne correspond pas exactement à mon problème. En fait, mon vrai problème est d'obtenir le contenu de cette balise (my_class3) sans text4 et text14 par exemple. Je vais le modifier pour être exact. – carpediem

Questions connexes