在Dom4j中使用Xpath

尝试访问dom4j上已解析的xml文档的任何节点时,我收到以下exception:

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,我假设这意味着doc(解析的xml doc)包含它应该包含的内容。

  System.out.println(doc.asXML()); 

我非常感谢你的帮助!

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

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

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

  jaxen jaxen 1.1.1  

话虽如此,我希望他们能够解决他们的问题并为所有人解决这个问题。

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

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

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

如果从命令行调用解析器,则可以使用-classpath选项:

 java -classpath C:\myjars\jar1.jar;C:\myjars\jar1.jar 

例如,如果要从Ant调用解析器,请使用标记:

     

您的xpath表达式甚至没有被评估,因此您应该停止使用它们,直到您解决了类路径问题。

万一其他人在JBoss Fuse中遇到这个问题,我会添加解决了我的问题:

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

 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。