Utilisation de XPath dans Dom4j

j'obtiens l'exception suivante lorsque vous essayez d'accéder à tous les nœuds d'un document xml analysé sur dom4j:

Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
at org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)
at org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)
at org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164)
at xmlparser.LevelsExtractor.findI(LevelsExtractor.java:73)
at xmlparser.Main.main(Main.java:33)

je sais que l'analyse des œuvres, parce que je peux avoir l'analyseur d'imprimer le document xml ou l'enregistrer dans un fichier. Voici le code que j'utilise.

Pour analyser le document:

 public class Parser {

 public Document parseWithSAX(File aFile) throws DocumentException {
    SAXReader xmlReader = new SAXReader();
    Document doc = xmlReader.read(aFile);
    return doc;
  }

Pour essayer d'obtenir un nœud j'ai essayé les lignes suivantes, qui tous produisent la même erreur:

      List list = doc.selectNodes("");
      QName qn = new QName("////Token/text()='Introduction'");
      Element el = doc.selectSingleNode("////Token/text()='Introduction'");
      Node node = doc.selectSingleNode( "/DOCUMENT/PAGE/TEXT/TOKEN/text()= 'Introduction'");

ceci imprimera le doc xml que je supposons que doc (qui est le xml doc parsé) contient ce qu'il devrait.

      System.out.println(doc.asXML());

j'apprécie vraiment votre aide!

19
demandé sur javanna 2009-11-03 22:29:47

5 réponses

vous devriez ajouter jaxen bibliothèque de votre chemin de classe.

EDIT: en fait original dom4j contient jaxen.jar aussi bien que toutes les autres dépendances.

16
répondu Andrey Adamovich 2009-11-03 19:42:45

si vous utilisez mvn2, ce qui suit fonctionnera avec dom4j 1.6.1:

<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.1</version>
</dependency>

cela étant dit, j'espère qu'ils répareront leur pom et sauveront à tout le monde cette perturbation.

17
répondu James 2010-12-03 23:04:39

donc xpath fonctionne si j'inclus jaxen-1.1-bêta-6.jarre en plus de la jarre jdom4. Remarque le jaxen-1.1.1.jar ne fonctionne pas. Si vous avez un classdef erreur de jdom regarder leurs dépendances et assurez-vous d'utiliser leurs approuvé pots, (qui, pour la 1.6.1 version est souvent une version antérieure du pot). J'espère que cela aidera n'importe qui avec un problème semblable. Merci encore pour l'aide de tous!

5
répondu Daniel Hawthorne 2009-11-07 01:13:20

java.lang.NoClassDefFoundError est lancé par la JVM lorsqu'une dépendance qui était disponible au moment où une classe particulière a été compilée ne peut pas être trouvée sur classpath lorsque la classe est chargée pour être utilisée par la JVM.

comment invoquez-vous le code de l'analyseur? Vérifiez et assurez-vous que toutes les dépendances de DOM4J dans le lib le dossier de la distribution DOM4J (jaxen, jaxme-api etc) est sur classpath.

Si vous exécutez l'analyseur de la ligne de commande vous pouvez utiliser le -classpath option:

java -classpath C:\myjars\jar1.jar;C:\myjars\jar1.jar

si vous invoquez L'analyseur D'Ant par exemple utilisez le <classpath> balise:

<classpath>  
    <pathelement path="C:\myjars\jar1.jar"/>  
    <pathelement path="C:\myjars\jar2.jar"/>
</classpath> 

vos expressions xpath ne sont même pas évaluées donc vous devriez arrêter de les prendre jusqu'à ce que vous ayez réglé vos problèmes classpath.

1
répondu Tendayi Mawushe 2009-11-03 21:43:44

Dans le cas peu probable que quelqu'un d'autre rencontre ce problème dans JBoss Fuse, je vais ajouter ce qui a résolu mon problème:

vous aurez besoin d'envelopper les jarres jaxen - et dom4j comme des paquets OSGi.

osgi:install -s wrap:mvn:jaxen/jaxen/1.1-beta-6
osgi:install -s wrap:mvn:dom4j/dom4j/1.6.1

dans cet ordre précis, comme je l'ai découvert à la manière forte. J'avais déjà emballé le pot dom4j et j'avais simplement ajouté le pot jaxen après que le fait eut échoué.

0
répondu noMad17 2016-11-08 14:52:19