Ответ 1
Вы должны добавить jaxen в свой путь к классу.
РЕДАКТИРОВАТЬ. Фактически исходный dom4j дистрибутив содержит jaxen.jar в этом, а также во всех других зависимостях.
Я получаю следующее исключение при попытке получить доступ к любым узлам анализируемого 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;
}
Чтобы попытаться получить node, я пробовал следующие строки, все из которых производят одну и ту же ошибку:
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());
Я очень ценю вашу помощь!
Вы должны добавить 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.jar в дополнение к jdom4 jar. Обратите внимание, что jaxen-1.1.1.jar не работает. Если у вас есть ошибка classdef из jdom, посмотрите на их зависимости и убедитесь, что вы используете их одобренные банки (что для версии 1.6.1 теперь часто является более старой версией фляги). Надеюсь, это поможет любому, у кого есть аналогичная проблема. Еще раз спасибо за помощь!
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>
:
<classpath>
<pathelement path="C:\myjars\jar1.jar"/>
<pathelement path="C:\myjars\jar2.jar"/>
</classpath>
Ваши выражения xpath даже не оцениваются, поэтому вы должны прекратить их использование до тех пор, пока не разобрались с проблемами класса.
В маловероятном случае, когда кто-либо еще столкнется с этой проблемой в 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 после того, как факт не увенчался успехом.