在dom4j中使用xpath

bq3bfh9z  于 2021-06-30  发布在  Java
关注(0)|答案(5)|浏览(331)

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

我真的很感谢你的帮助!

zynd9foi

zynd9foi1#

因此,如果除了jdom4jar之外还包括jaxen-1.1-beta-6.jar,xpath就可以工作。注意jaxen-1.1.1.jar不起作用。如果您在jdom中遇到classdef错误,请查看它们的依赖关系,并确保您使用的是它们认可的jar(对于1.6.1版本来说,现在通常是jar的较旧版本)。希望这能帮助任何有类似问题的人。再次感谢大家的帮助!

trnvg8h3

trnvg8h32#

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

b91juud3

b91juud33#

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

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

也就是说,我希望他们能修复他们的pom,避免每个人的麻烦。

mpgws1up

mpgws1up4#

如果其他人在jboss fuse中遇到这个问题,我将添加解决问题的方法:
您需要将jaxen和dom4jjar打包为osgi包。

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

我发现这条路很难走。我已经 Package 了dom4jjar,并在失败后简单地添加jaxen jar。

voase2hg

voase2hg5#

java.lang.NoClassDefFoundError 当编译特定类时可用的依赖项在类路径上找不到时,由jvm抛出,此时类被加载以供jvm使用。
如何调用解析器代码?检查并确保 lib dom4j发行版(jaxen、jaxmeapi等)的文件夹位于类路径上。
如果从命令行调用解析器,可以使用 -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表达式甚至没有被计算,所以您应该停止调整这些表达式,直到您解决了类路径问题。

相关问题