Используя XPath в Dom4j
Я получаю следующее исключение при попытке доступа к любым узлам проанализированного xml-документа на 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)
Я знаю, что парсинг работает, потому что я могу заставить парсер распечатать xml-документ или сохранить его в файл. Вот код, который я использую.
для разбора документа:
public class Parser {
public Document parseWithSAX(File aFile) throws DocumentException {
SAXReader xmlReader = new SAXReader();
Document doc = xmlReader.read(aFile);
return doc;
}
чтобы попытаться получить узел, я пробовал следующие строки, все из которых производят ту же ошибку:
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'");
это распечатает XML-документ, который я предположим, что doc (который является анализируемым XML-документом) содержит то, что он должен.
System.out.println(doc.asXML());
Я очень ценю вашу помощь!
5 ответов
вы должны добавить jaxen библиотека на вашем пути к классу.
редактировать: на самом деле оригинальный dom4j распределение содержится jaxen.jar в этом, а также во всех других зависимостях.
Если вы используете mvn2, следующее будет работать с dom4j 1.6.1:
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.1</version>
</dependency>
это, как говорится, Я надеюсь, что они исправят свой пом и избавят всех от этой проблемы.
Так xpath работает, если я включаю jaxen-1.1-beta-6.опарник в дополнение к опарнику jdom4. Обратите внимание на jaxen-1.1.1.банка не работает. Если у вас есть ошибка classdef от jdom, посмотрите на их зависимости и убедитесь, что вы используете их одобренные банки (которые для версии 1.6.1 теперь часто являются более старой версией jar). Надеюсь, это поможет любому с подобной проблемой. Еще раз спасибо за помощь!
A java.lang.NoClassDefFoundError
вызывается JVM, когда зависимость, которая была доступна во время компиляции определенного класса, не может быть найдена на пути к классу, когда класс загружен для использования JVM.
как вы вызываете код парсера? Проверьте и убедитесь, что все зависимости DOM4J в lib
папка дистрибутива DOM4J (jaxen, jaxme-api и т. д.) находится на пути к классам.
если вы вызываете парсер из командной строки вы можете использовать -classpath
вариант:
java -classpath C:\myjars\jar1.jar;C:\myjars\jar1.jar
если вы вызываете парсер из Ant, например, используйте <classpath>
tag:
<classpath>
<pathelement path="C:\myjars\jar1.jar"/>
<pathelement path="C:\myjars\jar2.jar"/>
</classpath>
ваши выражения xpath даже не оцениваются, поэтому вы должны остановить их, пока не разберетесь с проблемами classpath.
в маловероятном случае, если кто-то еще должен столкнуться с этой проблемой в JBoss Fuse, я добавлю, что решило мою проблему:
вам нужно будет обернуть банки jaxen - и dom4j как OSGi-пучки.
osgi:install -s wrap:mvn:jaxen/jaxen/1.1-beta-6
osgi:install -s wrap:mvn:dom4j/dom4j/1.6.1
в этом конкретном порядке, как я узнал, трудный путь. Я уже завернул банку dom4j и просто добавил банку jaxen после того, как факт не удался.