XMLのマージが簡単になりました

Javaコードを書くよりもXMLファイルの操作に多くの時間を費やしているように見えることがあるので、ツールボックスに1つまたは2つのXMLラングラーを含めることは理にかなっています。この記事では、Laurent Bovetが、XPath宣言を使用してさまざまなソースからのXMLデータをマージおよび操作できるオープンソースツールであるXmlMergeの使用を開始します。

Java開発者は、ビルドスクリプト、デプロイメント記述子、構成ファイル、オブジェクトリレーショナルマッピングファイルなどで毎日XMLを使用します。これらすべてのXMLファイルを作成するのは面倒ですが、特に難しいことではありません。操作またはマージただし、このような異種ファイルに含まれるデータは、困難で時間がかかる場合があります。異なるモジュールに分割された複数のファイルを使用することをお勧めしますが、XMLの対象となるコンシューマーが理解できる唯一の形式であるため、1つの大きなファイルに制限されます。大きなファイル内の特定の要素をオーバーライドしたい場合がありますが、代わりにファイルの内容全体を複製することになります。たぶん、ドキュメント内のXML要素を簡単に操作できるようにするXSL変換(XSLT)を作成する時間が足りないだけかもしれません。いずれにせよ、XMLファイル内の要素をマージすることに関しては、これほど簡単なことはないようです。

この記事では、さまざまなXMLドキュメントのデータのマージと操作に関連する一般的な問題の多くを解決するために作成したオープンソースツールを紹介します。 EL4J XmlMergeは、LGPLライセンスに基づくJavaライブラリであり、さまざまなXMLソースからの要素を簡単にマージできます。 XmlMergeはEL4Jフレームワークの一部ですが、EL4Jとは独立して使用できます。コマンドラインからXmlMergeユーティリティを実行するために必要なのは、JDK1.5以降だけです。

以下の説明では、2つのXMLファイルのマージ、異なるソースからのXMLファイルデータのマージによるResource実行時のSpring Beanの作成、XmlMergeとAntの組み合わせによる作成など、さまざまな一般的なXMLマージシナリオでXmlMergeを使用する方法を学習します。ビルド時の自動デプロイメント記述子。また、XPath宣言と組み込みのアクションおよびマッチャーを使用して、XMLマージ中に特定の要素の処理を指定する方法についても説明します。最後に、XmlMergeの単純なマージアルゴリズムを見て、より特殊なXMLマージ操作のために拡張する方法を提案します。

例を実行したい場合は、今すぐXmlMergeをダウンロードできます。

XMLファイルのマージ

リスト1に、マージする必要のある2つのXMLファイルの非常に一般的な(そして大幅に簡略化された)例を示します。

リスト1.マージする必要のある2つのXMLファイル

File1.xml File2.xml

リスト2は、XmlMergeユーティリティを使用してこれら2つのファイルをマージするためのコマンドライン入力と、それに続く出力を示しています。

リスト2.XmlMergeを使用してマージされた2つのXMLファイル

~ $ java -jar xmlmerge-full.jar file1.xml file2.xml         ~ $

この最初のマージの例は非常に単純ですが、ファイルがマージされる順序が重要であることに気付いたかもしれません。順序を切り替えると、異なる結果が得られる可能性があります。(この記事の後半で、マージする2つのファイルの順序を切り替えたときに何が起こるかの例を示します。)ファイルの順序を維持するために、XmlMergeは最初のドキュメントにオリジナルという用語を使用し、2番目のドキュメントにパッチを使用します。パッチドキュメントは常に元のドキュメントにマージされるため、これは覚えやすいです。

異なるソースからのXMLファイルのマージ

XmlMergeユーティリティはJavaコードのどこにでも実装でき、それを使用してさまざまなソースからのデータを新しい便利なドキュメントにマージできます。リスト3では、これを使用して、アプリケーションファイルシステムのファイルとサーブレットリクエストのコンテンツを単一のドキュメントオブジェクトモデル(DOM)にマージしました。

リスト3.クライアントとサーバーのXMLをDOMにマージする

XmlMerge xmlMerge = new DefaultXmlMerge(); org.w3c.dom.Document doc = documentBuilder.parse( xmlMerge.merge( new FileInputStream("file1.xml"), servletRequest.getInputStream()));

実行時のSpringFrameworkリソースの作成

XmlMergeとSpringFrameworkを組み合わせると便利な場合があります。たとえばResource、リスト4に示すSpring Beanは、個別のXMLファイルを単一のXMLストリームにマージすることによって実行時に作成されました。次に、ResourceBeanを使用して、オブジェクトリレーショナルマッピング、ドキュメント生成などのために他のリソースを構成できます。

リスト4.Spring ResourceBean

     ch/elca/el4j/tests/xmlmerge/r1.xml     ch/elca/el4j/tests/xmlmerge/r2.xml            

ビルド時に自動化されたデプロイメント記述子を生成する

おそらくAntを使用してビルドを自動化したことがあるでしょう。それをXmlMergeと組み合わせて、ビルド時にXMLデプロイメント記述子を生成するのはどうですか?リスト5はXmlMergeTask作業中を示しています。

リスト5.XmlMergeTaskはデプロイメント記述子を生成します