在Dom4j中使用Xpath

时间:2009-11-03 19:29:48

标签: java xml dom4j

尝试访问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,我认为这意味着doc(解析的xml doc)包含它应该包含的内容。

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

我真的很感谢你的帮助!

5 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:17)

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

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

话虽如此,我希望他们能解决问题并为大家解决这个问题。

答案 2 :(得分:5)

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

答案 3 :(得分:1)

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

你是如何调用解析器代码的?检查并确保DOM4J发行版的lib文件夹(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表达式甚至没有被评估,因此在您解决类路径问题之前,应该停止使用它们。

答案 4 :(得分:0)

万一其他人应该在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。