21

尝试访问 dom4j 上已解析 xml 文档的任何节点时出现以下异常:

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());

我真的很感谢你的帮助!

4

5 回答 5

19

如果您使用的是 mvn2,则以下内容适用于 dom4j 1.6.1:

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

话虽如此,我希望他们修复他们的 pom 并为每个人省去这个麻烦。

于 2010-12-03T23:04:39.170 回答
18

您应该将jaxen库添加到您的类路径中。

编辑:实际上原始 dom4j发行版包含 jaxen.jar 以及所有其他依赖项。

于 2009-11-03T19:42:45.457 回答
5

因此,如果我在 jdom4 jar 之外包含 jaxen-1.1-beta-6.jar,则 xpath 可以工作。注意 jaxen-1.1.1.jar 不起作用。如果你有一个来自 jdom 的 classdef 错误,请查看它们的依赖项并确保你使用的是他们认可的 jar,(对于 1.6.1 版本,现在通常是 jar 的旧版本)。希望这可以帮助任何有类似问题的人。再次感谢大家的帮助!

于 2009-11-07T01:13:20.397 回答
1

java.lang.NoClassDefFoundError当加载特定类以供 JVM 使用时,如果在类路径上找不到在编译特定类时可用的依赖项,则 JVM 抛出A。

你是如何调用解析器代码的?检查并确保libDOM4J 分发(jaxen、jaxme-api 等)文件夹中的所有 DOM4J 依赖项都在类路径中。

如果您从命令行调用解析器,您可以使用以下-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 表达式甚至没有被评估,因此您应该停止调整这些表达式,直到您解决了类路径问题。

于 2009-11-03T20:29:03.373 回答
0

万一其他人在 JBoss Fuse 中遇到此问题,我将添加解决我问题的方法:

您需要将 jaxen- 和 dom4j jar 包装为 OSGi 捆绑包。

osgi:install -s wrap:mvn:jaxen/jaxen/1.1-beta-6
osgi:install -s wrap:mvn:dom4j/dom4j/1.6.1

在那个特定的顺序中,我发现很难。我已经包装了 dom4j jar 并在事实不成功后简单地添加了 jaxen jar。

于 2016-11-08T14:52:19.680 回答