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ドキュメント)に必要なものが含まれていることを意味すると思われる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で使用するためにロードされるときに、特定のクラスがコンパイルされたときに使用可能だった依存関係がクラスパスで見つからない場合、AはJVMによってスローされます。

パーサーコードをどのように呼び出していますか?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式は評価されていないため、クラスパスの問題を整理するまで、xpath式の微調整を停止する必要があります。

于 2009-11-03T20:29:03.373 に答える
0

JBoss Fuse で他の誰かがこの問題に遭遇する可能性は低いので、私の問題を解決したものを追加します。

jaxen-jar と 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 に答える