6

Java 6では、xerces XMLパーサー/シリアライザーの実装全体がJavaランタイム(rt.jar)に含まれるようになりました。パッケージはcom.sun。*名前空間の下に移動され、クライアントコード内で明示的に参照できるように立ち入り禁止になっています。これは、javaxAPIで定義されたファクトリを介してインスタンス化されるパーサーを使用する場合は問題になりません。

ただし、このコードではxercesシリアル化(org.apache.xml.serialize。*)も使用しています。AFAICT、SerializerとOutputFormatのインスタンスを作成するためのjavax.xmlAPI定義のファクトリはありません。これは、取得する唯一の方法がcom.sun.org.apache.xml.serialize。*APIを明示的に呼び出すことであることを意味しているようです。

javax.xml.streamでシリアル化クラスを見つけましたが、xercesOutputFormatクラスのような出力フォーマット制御を提供していないようです。

質問:

xerces.jarを含めずに、またcom.sun。*クラスを明示的にインスタンス化せずに、javax標準APIを介してxercesシリアル化機能(rt.jarにある)にアクセスする方法はありますか?

そうでない場合、同じ効果を達成するためのjavax API準拠の方法はありますか?

4

4 に答える 4

5

java.*公式またはAPIを通じて公開されていない Xerces 機能を使用したい場合javax.*、唯一の現実的な解決策は、Xerces をサードパーティ ライブラリとして含めることです。Xerces の JRE 内部バージョンに何らかの方法でアクセスすることは危険です。有効な JRE がそれらのクラスを持っていることを保証するものは何もないからです (別の JRE や、同じ JRE の他のバージョンでさえ、別の実装を使用して JAXP API を実装したり、別のパッケージに移動するだけです)。

于 2010-05-25T14:32:24.757 に答える
1

Sun API を参照したくない場合は、承認されたディレクトリに Xerces を配置できます。これは Sun のコピー/実装を置き換えますが、心配することなく API を使用できます (これが「公式の」方法です)。

Java 組み込み実装で​​は、出力を適切に制御することはできませんが、Xerces と API プロパティを使用して出力をより適切に制御することは可能です。これは、API が他の実装で役立つ可能性のある追加のプロパティを渡すことをサポートしているためです。最後の 1 つを自分で試したことはありません (ドキュメントのみを使用します)。

編集(コメントに応じて):基礎となるJDKをJAXPの独自の代替APIを指定できるポイントまで制御しない環境でXercesを使用したい場合は、Xercesを直接参照する必要があります(または参照sun パッケージの書き換え)。

Xercesを承認されたディレクトリに配置できる場合(または、承認された設定をオーバーライドする場合-率直に言って、アプリケーションサーバーではありそうにありませんが、Weblogicについては特に知りません)、プロパティを基礎となる実装に設定する「JDK」の方法は次のとおりですTransformerFactory.setAttribute 。実装によってはTransformer.setParameterとやり取りする場合があります。

Sun バンドルで十分な基礎となるバージョンである必要があることを追加する必要があります。Weblogic がそれを使用する場合 (または、それで十分な場合は独自の Xerces を使用する場合)、ここで運が良く、プロパティを渡して機能させることができます。 .

于 2010-05-24T19:27:30.653 に答える
1

私の知る限り、これを行うための公式 API はありません。奇妙なことに、Java XML API は XML を解析するためだけのものです。

ただし、XML Transformation API を使用して DOMDocumentをファイルに書き込むことはできます。この例を参照してください。

于 2010-05-24T19:06:37.083 に答える
0

javax.xml.bind.JAXBContext? オブジェクトを XML にバインド/シリアライズしようとしている場合は、JAXB が標準です。生の解析を行っている場合は、org.xml.sax および/または org.w3c.dom に探しているものが含まれているはずです。

更新: com.javax.transform パッケージが役立つはずです。こちらの Transformer の例をご覧ください。

于 2010-05-24T19:09:18.030 に答える