2010-09-01 28 views
1

J'essaie d'utiliser dom4j pour analyser un document xhtml. Si j'imprime simplement le document, je peux voir le document entier pour que je sache qu'il est chargé correctement. Les deux div que j'essaie de sélectionner sont exactement au même niveau dans le document.dom4j XPath ne fonctionne pas analyse syntaxique xhtml document

html 
    body 
    div 
    table 
     tbody 
     tr 
     td 
     table 
      tbody 
      tr 
      td 
       div class="definition" 
       div class="example" 

Mon code est

List<Element> list = document.selectNodes("//html/body/div/table/tbody/tr/td/table/tbody/tr/td"); 

mais la liste est vide quand je fais System.out.println(list);

Si je ne le fais List<Element> list = document.selectNodes("//html"); il ne revient en fait une liste avec un élément en elle. Donc, je suis confus au sujet de ce qui est faux avec mon xpath et pourquoi il ne trouvera pas ces divs

Répondre

3

Essayez de déclarer l'espace de noms xhtml au xpath, par exemple. liez-le au préfixe x et utilisez //x:html/x:body... comme expression XPath (voir aussi this article qui est cependant pour Groovy, pas pour Java). Probablement quelque chose comme ce qui suit devrait le faire en Java:

DefaultXPath xpath = new DefaultXPath("//x:html/x:body/..."); 
Map<String,String> namespaces = new TreeMap<String,String>(); 
namespaces.put("x","http://www.w3.org/1999/xhtml"); 
xpath.setNamespaceURIs(namespaces); 

list = xpath.selectNodes(document); 

(non testé)

+0

Cela a fonctionné parfaitement! Je n'avais pas réalisé que tu pouvais faire ça. J'ai aussi eu un div supplémentaire dont j'avais besoin dans le chemin. Mais je l'ai essayé à nouveau sans le x: et ça n'a pas fonctionné comme ça, donc votre solution l'a fait. J'ai pensé que l'analyse syntaxique de xhtml posait des problèmes par rapport à xml normal. –

1

Qu'en est-il juste "// div"? Ou "// html/body/div/table/tbody"? J'ai trouvé que les expressions XPath longues et littérales étaient difficiles à déboguer, car il est facile pour mes yeux de se faire piéger ... donc je les casse jusqu'à ce que ça fonctionne et que je reconstruise à nouveau.

+0

C'est ce que j'essayais de faire. C'est comme ça que j'ai attrapé le div manquant. Mais malheureusement j'avais encore besoin de la réponse d'André pour que le chemin fonctionne même après que les éléments aient été dans le bon ordre –

+0

Ah, oui ... j'avais raté la partie 'xhtml', donc si vous avez un espace de noms dans le fichier , vous en auriez certainement besoin. –

1

Une alternative pourrait être: -

//div[@class='definition' or @class='example'] 

Cette recherche pour « div » éléments, partout dans le document « classe » attributs des valeurs égales à la « définition » ou « exemple ».

Je trouve cette approche plus claire de ce que vous essayez de récupérer de la page. Un avantage supplémentaire est que si la structure de la page change, mais que les classes div restent les mêmes, votre xpath n'a pas besoin d'être mis à jour.

Vous pouvez également vérifier que votre xpath fonctionne avec un document HTML en utilisant le plugin firefox suivant, ce qui est très utile.

Firefox Plugin - XPath Checker 0.4.4