バックグラウンド
XML ファイルを構成および設定情報の入力として使用する Perl アプリケーションを設計しています。ドキュメントの階層があり、グローバル データがよりローカルな情報によって上書きされます。
私のプログラムは、より一般的なファイルへのパスを含む最もローカルな設定ファイルで呼び出されます。一部のローカル設定は絶対的であり、これらはプログラムでハードコードされます。
初期化タスクは、最上位レベルから呼び出しの設定を取得し、それらを読み取ってから各レベルに進み、それらを単一の XML ドキュメントとしてマージ/結合することです。
サンプルデータ
Global_layouts_100.xml
<CONFIG>
<GRP1>
<FIELD foo="abs" format="%.4f">QTY</FIELD>
<FIELD default="" format="%.2f">COST</FIELD>
<FIELD default="0" format="%.2f">AMT</FIELD>
<FIELD default="1960-01-01" format="YYYMMDD">TRANDATE</FIELD>
<FIELD>ACCOUNT</FIELD>
<FIELD default="0">ACCT_TYPE</FIELD>
</GRP1>
<GRP2>
<FIELD> 1 </FIELD>
<FIELD> 2 </FIELD>
<FIELD> 3 </FIELD>
</GRP2>
</CONFIG>
Global_properties_100.xml
<CONFIG>
<CUS>
<GRP>GRP1</GRP>
<HDR>CUSTOMER</HDR>
<TLR>TLR${cnt}</TLR>
</CUS>
<XYZ>
<GRP>GRP2</GRP>
<HDR>ACCOUNTS</HDR>
<TLR>TLR${cnt}</TLR>
</XYZ>
</CONFIG>
Global_70.xml
<CONFIG>
<PARENT_SETTINGS>Global_layouts_100</PARENT_SETTINGS>
<PARENT_SETTINGS>Global_properties_100</PARENT_SETTINGS>
<LOOKUPS>
<MAP type="file">
<NAME>ACCT_TYPE_LOOKUP</NAME>
<PATH>${PATH}acct_type.csv</PATH>
<HEADERS>
<COLUMN>ACCT_TYPE</COLUMN>
<COLUMN>SOURCE_VALUE</COLUMN>
</HEADERS>
<KEYS>
<COLUMN>SOURCE_VALUE</COLUMN>
</KEYS>
</MAP>
</LOOKUPS>
</CONFIG>
local.xml
<CONFIG>
<PARENT_SETTINGS>Global_70</PARENT_SETTINGS>
<BATCH>
<CUS>
<SRCFILE type="csv" delimiter="|">/path/to/src_file</SRCFILE>
<OUTFILE>/path/to/out_file</OUTFILE>
<FIELDS>
<CUSTOMER>&CUSTOMER;</CUSTOMER>
<QTY default="0.0" col="23"></QTY>
<COST format="%.4f" col="21"></COST>
<FEE col="18"></FEE>
</FIELDS>
</CUS>
<XYZ>
<SRCFILE />
<OUTFILE />
<FIELDS>
<FIELD_1 />
<FIELD_2 />
<FIELD_3 />
<FIELD_4 />
<FIELD_5 />
</FIELDS>
</XYZ>
</BATCH>
</CONFIG>
ここで、プログラムを開始する local.xml と、処理する引数として CUS が与えられる場合、この XML (または同等の perl データ構造) を確認したいと思います。
<CONFIG>
<HDR>CUSTOMER</HDR>
<TLR>TLR${cnt}</TLR>
<SRCFILE type="csv" delimiter="|">/path/to/src_file</SRCFILE>
<OUTFILE>/path/to/out_file</OUTFILE>
<LOOKUPS>
<MAP type="file">
<NAME>ACCT_TYPE_LOOKUP</NAME>
<PATH>${PATH}acct_type.csv</PATH>
<HEADERS>
<COLUMN>ACCT_TYPE</COLUMN>
<COLUMN>SOURCE_VALUE</COLUMN>
</HEADERS>
<KEYS>
<COLUMN>SOURCE_VALUE</COLUMN>
</KEYS>
</MAP>
</LOOKUPS>
<CUS>
<FIELD foo="abs" format="%.4f" default="0.0" col="23">QTY</FIELD>
<FIELD default="" format="%.4f" col="21">COST</FIELD>
<FIELD default="0" format="%.2f">AMT</FIELD>
<FIELD default="1960-01-01" format="YYYMMDD">TRANDATE</FIELD>
<FIELD>ACCOUNT</FIELD>
<FIELD default="0">ACCT_TYPE</FIELD>
<FIELDS>
<CUSTOMER>&CUSTOMER;</CUSTOMER>
<QTY default="0.0" col="23"></QTY>
<COST format="%.4f" col="21"></COST>
<FEE col="18"></FEE>
</FIELDS>
</CUS>
</CONFIG>
そして、プログラムが開始する local.xml と、処理する引数として XYZ が与えられる場合、私はこの XML (または同等の perl データ構造) を見たいと思います:
<CONFIG>
<HDR>ACCOUNTS</HDR>
<TLR>TLR${cnt}</TLR>
<SRCFILE />
<OUTFILE />
<LOOKUPS>
<MAP type="file">
<NAME>ACCT_TYPE_LOOKUP</NAME>
<PATH>${PATH}acct_type.csv</PATH>
<HEADERS>
<COLUMN>ACCT_TYPE</COLUMN>
<COLUMN>SOURCE_VALUE</COLUMN>
</HEADERS>
<KEYS>
<COLUMN>SOURCE_VALUE</COLUMN>
</KEYS>
</MAP>
</LOOKUPS>
<XYZ>
<FIELD> 1 </FIELD>
<FIELD> 2 </FIELD>
<FIELD> 3 </FIELD>
<FIELDS>
<FIELD_1 />
<FIELD_2 />
<FIELD_3 />
<FIELD_4 />
<FIELD_5 />
</FIELDS>
</XYZ>
</CONFIG>
質問
これらの XML ドキュメントをマージする最も効率的な方法は何ですか?
によって返されたデータ構造を使用して自分で実行できますかXML::Simple
、それとも他の XML ツールを使用する必要がありますか?
私の質問が十分に明確で、サンプル XML データを必要としないことを願っています。何かを見る必要がある場合は、サンプルのものを投稿できます。
簡単に言えば、個々の XML ドキュメントの階層をマージする最善の方法は何かということです。