web-dev-qa-db-ja.com

Dom4jでのXpathの使用

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());

私は本当にあなたの助けに感謝します!

19

jaxen ライブラリをクラスパスに追加する必要があります。

[〜#〜] edit [〜#〜]:実際には元のdom4j distribution にはjaxen.jarが含まれています他のすべての依存関係。

17

Mvn2を使用している場合、以下はdom4j1.6.1で機能します。

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

そうは言っても、彼らが彼らのpomを修正し、この問題をみんなに救ってくれることを願っています。

17
James

したがって、jdom4jarに加えてjaxen-1.1-beta-6.jarを含めるとxpathが機能します。 jaxen-1.1.1.jarが機能しないことに注意してください。 jdomからのclassdefエラーがある場合は、それらの依存関係を調べて、承認されたjarを使用していることを確認してください(1.6.1バージョンでは、多くの場合、jarの古いリリースです)。これが同様の問題を抱えている人に役立つことを願っています。みんなの助けてくれてありがとう!

5

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式は評価されていないため、クラスパスの問題を整理するまで、xpath式の調整を停止する必要があります。

1
Tendayi Mawushe

万が一、JBoss Fuseでこの問題が発生した場合は、問題を解決したものを追加します。

Jaxen-とdom4jの両方のjarファイルをOSGiバンドルとしてラップする必要があります。

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

その特定の順序で、私が難しい方法を見つけたように。私はすでにdom4jjarをラップし、事実が失敗した後にjaxenjarを追加するだけでした。

0
noMad17