XML を意味のあるJava のドメイン オブジェクトに変換する効率的な方法が必要です。以下は、私が使用しなければならない XML の選択です (一部の値は隠されています)。ここに私が取り組まなければならない基本的な制約があります:
- 操作するスキーマはありません。自動生成されたスキーマは、変数の「入れ子」が原因でうまくいきません。
- 任意の domain-object に 0-* domain-object タグを含めることができます
- 任意の domain-object に 0-* 値タグを含めることができます。
- すべての入れ子が同じように作成されるわけではありません。場合によっては、値の「キー」に暗黙的なネストが含まれます。たとえば、「config[0].cbs」は、それぞれが異なる .cbs の値を持つ構成オブジェクトのコレクションを示します。
- XML 構造を変更できない場合があります。
- 「represents」属性はタイプを示します。
- 「nestedKey」属性は、型内の変数名を示します。
- これらの XML ファイルは非常に大きくなる可能性があります。
JAXB を使用してみましたが、タグの「汎用性」が原因でうまくいきません。おそらく、私の JAXB-fu では不十分です。現在の実装 (これを継承) は SAX ですが、実際には機能しません。私は XStream を見てきましたが、タグに何らかのセマンティック構造を想定しているようです。
意味のあるドメイン オブジェクトを生成するために、最小限のコードで、最も柔軟で、最も拡張性の高いアプローチが必要です。可能であれば、HashMaps のネストを避けたいと思います (これは、機能しない現在のソリューションの一部です)。創造的、ハック、または巧妙なアイデアは歓迎され、率直な「当たり前」の回答も歓迎されます。
XML スニペット:
<?xml version="1.0"?>
<domain-objects>
<types language="C++">
<type prefix="bool" language-representation="bool" />
<type prefix="char" language-representation="char" />
<type prefix="domain_object" language-representation="opti::DomainObject" />
<type prefix="domain_object" language-representation="DomainObject" />
<type prefix="double" language-representation="double" />
<type prefix="float" language-representation="float" />
...
</types>
<domain-object key="(unique object id)" represents="PerfSuite">
<domain-object key="(unique object id)" nestedKey="testCore" represents="PerfTestCore">
<value key="suiteUuid" type="stl_string">(unique object id)</value>
<value key="suiteName" type="stl_string">(some name)</value>
<value key="suiteId" type="int">(some number)</value>
<value key="suiteDeleted" type="bool">false</value>
</domain-object>
<domain-object key="(unique object id)" nestedKey="testResults" represents="PerfTestResults">
<domain-object key="(unique object id)" nestedKey="services_0" represents="PerfServiceResult">
<domain-object key="(unique object id)" nestedKey="stepResults_0" represents="PerfStepResult">
<value key="ir.max" type="int64">(some number)</value>
<value key="ftd.avg" type="float">(some number)</value>
<value key="ftd.max" type="float">(some number)</value>
...
</domain-object>
<value key="duration" type="uint">(some number)</value>
<value key="flow" type="uint16">(some number)</value>
...
<value key="config[1].flrThreshold" type="float">(some number)</value>
<value key="config[1].fdvPercent" type="float">(some number)</value>
<value key="index" type="uint16">(some number)</value>
<value key="config[0].cbs" type="uint64">(some number)</value>
<value key="svlanVid" type="uint16">(some number)</value>
<value key="config[1].availThreshold" type="float">(some number)</value>
...