2009-11-03 11 views
19

ottengo la seguente eccezione quando si tenta di accedere a tutti i nodi di un documento XML analizzato il dom4j:Uso di XPath in 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) 

So che i lavori di analisi, perché posso avere la stampa parser il xml documento o salvarlo su file. Ecco il codice che sto usando.

per analizzare il documento:

public class Parser { 

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

per cercare di ottenere un nodo Ho provato le seguenti linee, i quali producono lo stesso errore:

 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'"); 

Questo stamperà la xml doc che presumo significhi che doc (che è il documento xml analizzato) contenga ciò che dovrebbe.

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

Ho davvero apprezzato il tuo aiuto!

risposta

16

È necessario aggiungere la libreria jaxen al percorso della classe.

MODIFICA: effettivamente dom4j distribution contiene jaxen.jar in questo e tutte le altre dipendenze.

+0

Pensavo che la distribuzione includesse anche la jaxen lib, ma ora ho incluso il jar solo per vedere e ha rimosso il messaggio di errore. Sfortunatamente me ne ha dato uno nuovo. Così ora si lamenta alla parentesi finale di un blocco di codice usando il documento analizzato che "ha raggiunto la fine del file durante l'analisi". Ora ciò si verifica anche sul codice che ha attraversato l'albero tramite iteratori (che funzionavano prima). Penso che questo significhi che il nuovo jaxon jar stia scherzando con l'analisi, ma posso ancora analizzare e quindi stampare nuovamente il file, quindi non sembra essere il caso. –

+0

NoClassDefFoundException può significare solo che non si ha la classe necessaria sul percorso della classe o se esiste una versione errata. Controlla di nuovo il tuo percorso di classe. Rimuovere i barattoli non necessari e aggiungere solo quelli che vengono utilizzati. –

+0

gli unici jar che avevo originariamente era il dom4j-1.6.1.jar, che mi ha dato l'errore di classe def. Ho aggiunto il jaxen-1.1.1.jar che si è sbarazzato dell'errore di classe def e mi ha dato la "fine raggiunta del file durante l'analisi dell'errore". Grazie per il tuo aiuto e la risposta rapida Superfilin. –

1

A java.lang.NoClassDefFoundError viene generato dalla JVM quando una dipendenza che era disponibile al momento della compilazione di una particolare classe non può essere trovata sul classpath quando la classe viene caricata per essere utilizzata dalla JVM.

Come si sta richiamando il codice parser? Controlla e assicurati che tutte le dipendenze di DOM4J nella cartella lib della distribuzione DOM4J (jaxen, jaxme-api, ecc.) Siano nel classpath.

Se si invoca il parser dalla riga di comando è possibile utilizzare l'opzione -classpath:

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

Se si invoca il parser da Ant per esempio usare il tag <classpath>:

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

Le tue espressioni xpath non vengono neppure valutate, quindi dovresti smetterla con il mouse finché non avrai risolto i problemi del classpath.

5

Quindi xpath funziona se includo jaxen-1.1-beta-6.jar oltre al jar jdom4. Nota jaxen-1.1.1.jar non funziona. Se hai un errore classdef da jdom controlla le loro dipendenze e assicurati di utilizzare i loro jar approvati, (che per la versione 1.6.1 è spesso una versione precedente del jar). Spero che questo aiuti chiunque con un problema simile. Grazie ancora per l'aiuto di tutti!

17

Se stai usando mvn2, di seguito lavorerà con dom4j 1.6.1:

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

Detto questo, spero che fissano la loro pom e salvare tutti questi guai.

0

Nel caso improbabile che chiunque altro dovrebbe incontrare questo problema in JBoss Fuse io aggiungo quello che risolto il mio problema:

Sarà necessario avvolgere sia il jaxen- e le giare DOM4J come OSGi-bundle.

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

In quell'ordine particolare, come ho scoperto nel modo più difficile. Avevo già avvolto il vaso dom4j e semplicemente aggiungendo il barattolo di jaxen dopo che il fatto non aveva avuto successo.