Подтвердить что ты не робот

Использование 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;
  }

Чтобы попытаться получить 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());

Я очень ценю вашу помощь!

4b9b3361

Ответ 1

Вы должны добавить jaxen в свой путь к классу.

РЕДАКТИРОВАТЬ. Фактически исходный dom4j дистрибутив содержит jaxen.jar в этом, а также во всех других зависимостях.

Ответ 2

Если вы используете mvn2, то с dom4j 1.6.1 будет работать следующее:

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

Сказав это, я надеюсь, что они исправит своего жука и избавят всех от этой проблемы.

Ответ 3

Итак, xpath работает, если я включил jaxen-1.1-beta-6.jar в дополнение к jdom4 jar. Обратите внимание, что jaxen-1.1.1.jar не работает. Если у вас есть ошибка classdef из jdom, посмотрите на их зависимости и убедитесь, что вы используете их одобренные банки (что для версии 1.6.1 теперь часто является более старой версией фляги). Надеюсь, это поможет любому, у кого есть аналогичная проблема. Еще раз спасибо за помощь!

Ответ 4

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 даже не оцениваются, поэтому вы должны прекратить их использование до тех пор, пока не разобрались с проблемами класса.

Ответ 5

В маловероятном случае, когда кто-либо еще столкнется с этой проблемой в 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 после того, как факт не увенчался успехом.