java xml dom4j
distribution

java - Usando Xpath en Dom4j



xml (5)

Obtengo la siguiente excepción al intentar acceder a los nodos de un documento XML analizado 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 el análisis funciona, porque puedo hacer que el analizador imprima el documento xml o lo guarde 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 intentar obtener un nodo, he intentado las siguientes líneas, todas las 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 documento xml que supongo que significa que doc (que es el documento xml analizado) contiene lo que debería.

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

¡Realmente aprecio tu ayuda!


Debe agregar la biblioteca jaxen a su ruta de clase.

EDITAR : La distribution dom4j realmente original contiene jaxen.jar en eso así como todas las demás dependencias.


En el improbable caso de que alguien más encuentre este problema en JBoss Fuse, agregaré lo que resolvió mi problema:

Necesitará envolver los jaxen- y los dom4j como paquetes OSGi.

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 descubrí el camino difícil. Ya había envuelto el tarro dom4j y simplemente había agregado el tarro jaxen después de que el hecho no hubiera tenido éxito.


Entonces xpath funciona si incluyo jaxen-1.1-beta-6.jar además del jdom4 jar. Tenga en cuenta que el jaxen-1.1.1.jar no funciona. Si tiene un error classdef de jdom, consulte sus dependencias y asegúrese de que está utilizando sus archivos jar 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 alguien con un problema similar. ¡Gracias otra vez a todos por su ayuda!


La JVM java.lang.NoClassDefFoundError una java.lang.NoClassDefFoundError cuando una dependencia que estaba disponible en el momento en que se compiló una clase en particular no se puede encontrar en classpath cuando la clase está cargada para que la JVM la utilice.

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

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

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

Si está invocando el analizador desde Ant, por ejemplo, use la etiqueta <classpath> :

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

Sus expresiones xpath ni siquiera están siendo evaluadas, por lo que debe dejar de usarlas hasta que haya resuelto sus problemas de classpath.


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

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

Dicho esto, espero que solucionen sus problemas y les ahorren a todos este problema.