2009-11-03 5 views
19

je reçois l'exception suivante lorsque vous essayez d'accéder à tous les nœuds d'un document XML analysé sur dom4j:Utilisation de XPath dans 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 les travaux d'analyse, parce que je peux avoir l'impression de l'analyseur le xml document ou enregistrez-le 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 que j'ai essayé que les lignes, toutes suivantes 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'"); 

Cela affichera la xml doc que je suppose signifie que doc (qui est le doc xml analysé) contient ce qu'il devrait.

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

J'apprécie vraiment votre aide!

Répondre

16

Vous devez ajouter jaxen bibliothèque à votre chemin de classe.

EDIT: Dom4j d'origine distribution contient jaxen.jar en cela ainsi que toutes les autres dépendances.

+0

Je pensais que la distribution incluait également la bibliothèque jaxen, mais j'ai inclus le fichier maintenant juste pour le voir, et il a supprimé le message d'erreur. Malheureusement, il m'a donné un nouveau. Alors maintenant, il se plaint à la fin d'un bloc de code en utilisant le document analysé que "il a atteint la fin du fichier lors de l'analyse." Maintenant cela se produit même sur du code qui a traversé l'arbre à travers des itérateurs (qui fonctionnaient auparavant). Je pense que cela signifie que le nouveau jaxon jar joue avec l'analyse, mais je peux toujours analyser et ensuite imprimer le fichier à nouveau, ce qui ne semble pas être le cas. –

+0

NoClassDefFoundException ne peut que signifier que vous n'avez pas la classe nécessaire sur votre chemin de classe ou qu'il existe une mauvaise version de celui-ci. Vérifiez à nouveau le chemin de votre classe. Enlevez les pots inutiles et ajoutez seulement ceux qui sont utilisés. –

+0

les seuls jars que j'avais à l'origine était le dom4j-1.6.1.jar, ce qui m'a donné l'erreur de classe def. J'ai ajouté le jaxen-1.1.1.jar qui s'est débarrassé de l'erreur de classe def et m'a donné la "fin de fichier atteinte lors de l'erreur d'analyse." Merci pour votre aide et réponse rapide Superfilin. –

1

Un fichier est lancé par la machine virtuelle Java lorsqu'une dépendance qui était disponible au moment de la compilation d'une classe particulière est introuvable sur le chemin de classe lorsque la classe est chargée pour l'utilisation par la machine virtuelle Java.

Comment êtes-vous Invoquer le code analyseur? Vérifiez et assurez-vous que toutes les dépendances DOM4J dans le dossier lib de la distribution de DOM4J (jaxen, jaxme-api etc.) sont sur le chemin de classe.

Si vous invoquez l'analyseur de la ligne de commande, vous pouvez utiliser l'option -classpath:

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

Si vous invoquez l'analyseur de Ant par exemple utiliser la balise <classpath>:

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

Vos expressions xpath n'étant même pas évaluées, vous devriez les arrêter jusqu'à ce que vous ayez résolu vos problèmes de classpath.

5

Alors XPath fonctionne si je jaxen-inclus 1,1-bêta-6.jar en plus du pot de jdom4. Notez que jaxen-1.1.1.jar ne fonctionne pas. Si vous avez une erreur classdef de jdom regardez leurs dépendances et assurez-vous que vous utilisez leurs jars approuvés, (qui pour la version 1.6.1 est maintenant souvent une ancienne version du jar). J'espère que cela aide tous ceux qui ont un problème similaire. Merci encore pour l'aide de tout le monde!

17

Si vous utilisez mvn2, ce qui suit travaillera avec dom4j 1.6.1:

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

Cela étant dit, je l'espère qu'elles fixent leur pom et sauver tout le monde ce trouble.

0

Dans le cas peu probable que quelqu'un d'autre devrait rencontrer ce problème dans JBoss Fuse Je vais ajouter ce a résolu mon problème:

Vous devrez envelopper à la fois le jaxen- et les pots dom4j comme OSGi faisceaux.

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

Dans cet ordre particulier, comme je l'ai découvert à la dure. J'avais déjà enveloppé le pot dom4j et simplement ajouté le pot jaxen après que le fait a été infructueux.