2009-11-03 33 views
19

consigo la siguiente excepción al intentar acceder a todos los nodos de un documento XML analizado en dom4j:Usando XPath en 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) 

sé que los trabajos de análisis, porque puedo tener la impresión analizador a cabo el xml documentar o guardarlo en un archivo. Aquí está el código que estoy usando.

Para analizar el documento:

public class Parser { 

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

para tratar de conseguir un nodo He probado las siguientes líneas, todos los cuales producen el mismo error:

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

Esto imprimirá el xml doc que supongo significa que doc (que es el documento xml analizado) contiene lo que debería.

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

Realmente aprecio su ayuda!

Respuesta

16

Debe agregar la biblioteca jaxen a su ruta de clase.

EDIT: En realidad, el original dom4j distribution contiene jaxen.jar en eso, así como en todas las demás dependencias.

+0

Pensé que la distribución incluía también la lib jaxen, pero incluí el jar ahora solo para ver, y eliminó el mensaje de error. Desafortunadamente, me dio uno nuevo. Entonces ahora se queja en el corchete final de un bloque de código usando el documento analizado que "llegó al final del archivo mientras se analizaba". Ahora esto ocurre incluso en el código que atraviesa el árbol a través de iteradores (que funcionó antes). Creo que esto significa que el nuevo jar de jaxon está jugando con el análisis sintáctico, pero aún puedo analizar y luego imprimir el archivo de nuevo, por lo que no parece ser el caso. –

+0

NoClassDefFoundException solo puede significar que no tiene la clase necesaria en su ruta de clases o que hay una versión incorrecta de eso. Verifica tu ruta de clase una vez más. Quite los frascos innecesarios y agregue solo los que se usan. –

+0

el único jar que tenía originalmente era el dom4j-1.6.1.jar, que me dio el error de definición de clase. Agregué el jaxen-1.1.1.jar que eliminó el error de definición de clase y me dio el "fin de archivo alcanzado al analizar el error". Gracias por su ayuda y respuesta rápida Superfilin. –

1

La JVM genera un java.lang.NoClassDefFoundError cuando una dependencia que estaba disponible en el momento en que se compiló una clase en particular no puede encontrarse en el classpath cuando la clase se carga para ser utilizada por la JVM.

¿Cómo invoca el código del analizador? Compruebe y asegúrese de que todas las dependencias de DOM4J en la carpeta lib de la distribución DOM4J (jaxen, jaxme-api, etc.) estén en classpath.

Si está invocando el analizador de la línea de comandos que puede usar la opción -classpath:

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

Si está invocando el analizador de la hormiga por ejemplo utilizar el <classpath> etiqueta:

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

Sus expresiones xpath aún no están siendo evaluadas, por lo que debe detenerlas hasta que haya resuelto sus problemas de classpath.

5

Así que xpath funciona si incluyo jaxen-1.1-beta-6.jar además del jdom4 jar. Tenga en cuenta que jaxen-1.1.1.jar no funciona. Si tiene un error de clase de jdom, mire sus dependencias y asegúrese de estar usando los archivos aprobados, (que para la versión 1.6.1 ahora es a menudo una versión anterior del archivo jar). Espero que esto ayude a cualquier persona con un problema similar. ¡Gracias otra vez a todos por su ayuda!

17

Si está utilizando mvn2, lo siguiente será trabajar con dom4j 1.6.1:

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

Dicho esto, espero que fijan su pom y salvar a todos estos problemas.

0

En el improbable caso de que cualquier persona debería encontrar este tema en JBoss Fuse Voy a añadir lo que resolvió mi problema:

Usted tendrá que ajustar tanto el jaxen- y los frascos dom4j como OSGi-haces.

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

En ese orden particular, como me enteré de la manera difícil. Ya había envuelto el tarro dom4j y simplemente agregué el tarro jaxen después de que el hecho no tuvo éxito.