在Dom4j中使用Xpath

23

当我尝试访问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());

我非常感谢你的帮助!

5个回答

20

如果你使用的是mvn2版本,以下内容可与dom4j 1.6.1兼容:

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

话虽如此,我希望他们修复他们的pom文件并避免给大家带来麻烦。


19
你应该将jaxen库添加到你的类路径中。 编辑: 实际上,原始dom4j发行版中包含jaxen.jar以及所有其他依赖项。

我以为发行版中也包括了jaxen库,但现在我已经加入了jar文件来验证,并且它确实消除了错误信息。不幸的是,它给我带来了新问题。所以现在,在使用解析文档的代码块的末尾括号处,它会抱怨“在解析时已到达文件末尾”。即使是通过迭代器遍历树的代码也会出现这种情况(之前是可以工作的)。我认为这意味着新的jaxon jar正在干扰解析,但我仍然可以解析并再次将文件打印出来,所以这不似乎是问题的原因。 - Daniel Hawthorne
NoClassDefFoundException 只能意味着您的类路径上要么没有所需的类,要么存在错误版本。请再次检查您的类路径。删除不需要的 JAR 包,仅添加已使用的 JAR 包。 - Andrey Adamovich
我最初只有dom4j-1.6.1.jar,这给了我类定义错误。我添加了jaxen-1.1.1.jar,消除了类定义错误,但出现了“解析时到达文件结尾”错误。感谢您的帮助和快速响应,Superfilin。 - Daniel Hawthorne

5

如果我除了jdom4 jar之外还包含jaxen-1.1-beta-6.jar,那么xpath就能够正常工作。请注意,jaxen-1.1.1.jar不起作用。如果您在jdom中遇到类定义错误,请查看它们的依赖项,并确保您正在使用其批准的jar(对于1.6.1版本来说,通常是较旧版本的jar)。希望这可以帮助任何遇到类似问题的人。再次感谢大家的帮助!


1

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表达式甚至没有被评估,所以在解决了类路径问题之前,你应该停止调整它们。

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文件并不成功。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接