Используя 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 после того, как факт не удался.