0

XML を意味のあるJava のドメイン オブジェクトに変換する効率的な方法が必要です。以下は、私が使用しなければならない XML の選択です (一部の値は隠されています)。ここに私が取り組まなければならない基本的な制約があります:

  1. 操作するスキーマはありません。自動生成されたスキーマは、変数の「入れ子」が原因でうまくいきません。
  2. 任意の domain-object に 0-* domain-object タグを含めることができます
  3. 任意の domain-object に 0-* 値タグを含めることができます。
  4. すべての入れ子が同じように作成されるわけではありません。場合によっては、値の「キー」に暗黙的なネストが含まれます。たとえば、「config[0].cbs」は、それぞれが異なる .cbs の値を持つ構成オブジェクトのコレクションを示します。
  5. XML 構造を変更できない場合があります。
  6. 「represents」属性はタイプを示します。
  7. 「nestedKey」属性は、型内の変数名を示します。
  8. これらの 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>
...
4

1 に答える 1

0

この問題を完全に解決できるツールはありません。

JAXB は、解析部分の正しい答えである可能性があります。各ドメイン オブジェクトを実際のドメイン オブジェクトに変換する場合は、最終パスを自分で行う必要があります。

JAXB は、"float" を解析して、float から float へのマップを見つけるために型テーブルを検索する必要があることを判断できません。オブジェクトで「config[1].fdvPercent」を見つけることも、その機能を超えています。

私が見る限り、スキーマで記述できるかなり一貫した文書構造を持っています。これを XML スキーマに記述したり、クラスに注釈を付けたりするのは簡単です。

domain-objects = types+, domain-object+
domain-object = domain-object*, value*

ここから、あなたはあなたのために切り取られたあなたの仕事を持っています. いくつかのものが必要になると思います:

  • 各要素の文字列の型ごとの解析により、それぞれの値を取得できます
  • 型の文字列値から型ごとのパーサーへのマッピング (使用する C++? 型から Java 型に移動するには、追加のマッピング手順が必要になるようです)
  • 値を適用する変数を見つけることができるように、値キーのパーサー
  • オブジェクトをインスタンス化し、作成されたオブジェクトに値を設定するためのリフレクション

nestedKey または extends があなたにとって何を意味するのか推測できません。これらには、追加の手順が必要になる場合があります。

于 2012-09-21T17:56:02.877 に答える