3

jar を使用せずに DOM XML を更新する単純な関数を実行すると、正しく実行されます。多くの jar を含む既存のプロジェクトにコードを入れると、この例外が発生します

スレッド「メイン」での例外 java.lang.RuntimeException: net.sf.saxon.trans.XPathException: DOMSource を処理できません: saxon9-dom.jar がクラスパス上にあることを確認してください

ここ

  transformer.transform(source, result);

どこ

  TransformerFactory transformerFactory = TransformerFactory.newInstance();
  Transformer transformer = transformerFactory.newTransformer();
  DOMSource source = new DOMSource(docBuilder.parse(filepath));

このjarへの依存関係を導入せずにこれを解決するにはどうすればよいですか? ありがとう。

4

3 に答える 3

3

このメッセージは古いバージョンの Saxon からのものであり、提案されているように saxon9-dom をクラスパスに配置するか、Saxon jar ファイルをより新しいリリースに置き換えることで解決できます。

一般に、XSLT プロセッサをロードするために JAXP TransformerFactory メカニズムを使用しないことをお勧めします。使用する XSLT プロセッサを決定し、それを使用してアプリケーションをテストしてから、クラスパスに何が転がっていても、このプロセッサを本番環境で確実にロードする必要があります。アプリケーションを複数の XSLT プロセッサで動作させたい場合は、それを実現できますが、制御された方法で行う必要があります。

于 2013-03-15T20:56:23.473 に答える
2

の API ドキュメントからTransformerFactory.html#newInstance()、これを実現する方法がいくつかあることがわかります。

  1. xalanなど、他のトランスフォーマー実装がある場合は、その JAR をクラスパスの先頭に移動します。
  2. JVM オプションを追加します-Djavax.xml.transform.TransformerFactory=<any transformer class you need>
  3. JREディレクトリ内のプロパティファイル「lib/jaxp.properties」にプロパティを指定してください。
  4. 1 つのファイルのみで偽の JAR を作成します。META-INF\services\javax.xml.transform.TransformerFactoryこのファイルには、JDK のデフォルトのトランスフォーマー ファクトリのみが含まれますcom.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl。そして、それをクラスパスの先頭に追加します。
于 2013-03-15T17:57:03.340 に答える
1

net.sf.saxon.event.Sender のソース (例外の発生元) を取得し、エラーの原因となっている行を調べます。

    if (source instanceof DOMSource) {
        throw new XPathException("DOMSource cannot be processed: check that saxon9-dom.jar is on the classpath");
    }

素晴らしい。

net.sf.saxon.TransformerFactoryImpl の使用を停止し、org.apache.xalan.processor.TransformerFactoryImpl の使用を開始しました。その後はすべて順調でした。

于 2014-07-22T02:27:34.020 に答える