5

XML から作成される 3 種類の Java オブジェクトに対応するタグを持つ XML があります。オブジェクトの形式は次のとおりです。

A
- static Map<String, A>
- String name
- String aInfo1
- String aInfo2

B
- static Map<String, B>
- String name
- String bInfo1
- String bInfo2

C
- A aObject
- B bObject

ここで、私の XML で、A オブジェクトと B オブジェクトのタグのリストを定義し、名前フィールドを使用して A オブジェクトと B オブジェクトを参照する C オブジェクトのタグを定義します。2 つの要件があります。

  1. XML から A および B オブジェクトを読み取りながら、A および B に静的マップを設定します。マップには、A.name から A へのマッピング、および B.name から B へのマッピングがそれぞれ含まれます。
  2. XML タグから A.name と B.name を読み取り、A オブジェクトと B オブジェクトで定義されたマップを使用して、C オブジェクトに入力します。

JAXB のようないくつかの Java フレームワークについて読んだことがありますが、XML からそのようなタイプのオブジェクトを作成する方法を思いつくことができません。これをすぐに使用できる、または最小限のロジックで実行できる Java のフレームワークはありますか?

編集:

別の要件があります。フォームの D および E オブジェクトを定義する必要があります。

D
- Map<A, E>

web.xml でサーブレットを定義する方法と同様に、E オブジェクトを定義します。つまり、最初に E クラスの名前とクラスを定義し、次に E の名前を別の場所で使用します。さらに、パラメータを渡して E オブジェクトをインスタンス化します。タグは次のようになります。

<E>
    <name>queryProcessor</name>
    <class>com.mydomain.QueryProcessor</class>
</E>

これは、D で Map のコンテンツを定義するときに使用されます。

<D>
    <map>
        <A>name_of_some_A_object</A>
        <E name="queryProcessor">
            <param1>name_of_some_B_object</param1>
            <param2>name_of_some_B_object</param2>
        </E>
        <A>name_of_some_A_object</A>
        <E name="queryProcessor">
            <param1>name_of_some_B_object</param1>
            <param2>name_of_some_B_object</param2>
        </E>
     </map>
 </D>

基本的に、D のマップは、ベース タイプ E のクラスに渡されたパラメータと、その名前で参照される A のオブジェクトをインスタンス化することによって生成されます。

4

3 に答える 3

3
  • XSD で正しい XML 形式を指定する
  • JAXB クラスを生成する

(JAXB アノテーションに精通していて、XSD ではなく Java を使用してインターフェースを制御したい場合は、その逆も可能です)。

注: 静的なマップは、おそらく使用したくないものです。解決したい問題について詳しく説明していただければ、別の方法をご紹介できるかもしれません

編集:

XMLのフォーマットについて話しているのですか?または、なぜ XML が必要なのですか? アプリケーションを Java の外部で構成可能にするために XML が必要です。

車輪を再発明しているようです。Spring を見て、ニーズに合っているかどうかを確認してください。そうでない場合は、その理由を説明してください。

于 2011-12-02T16:14:43.633 に答える
1

XStream を見たいと思うかもしれません: http://x-stream.github.io/

XML との間でオブジェクトをマーシャリングおよびアンマーシャリングするための優れたライブラリであり、それ以上のことは (Spring とは異なり) 何もしません。http://x-stream.github.io/tutorial.htmlの例のように、次のように簡単に XML からオブジェクトをロードできます。

Person newJoe = (Person)xstream.fromXML(xml);

XStream が XML を理解できるようにするには、http://x-stream.github.io/alias-tutorial.htmlのようなエイリアスを設定する必要があります。

主に 2 つの静的マップが原因で、XStream だけでは問題を完全に解決することはできません。ただし、XStream に XML から As と B のリストをロードさせ、リストから 2 つのマップを作成することができます。

A と B を参照するオブジェクト C については、オブジェクト参照について説明している次のチュートリアルを読むことができます: http://x-stream.github.io/graphs.html。ニーズに合わない場合は、次のように、XStream を使用して XML から必要な情報を読み取る別のクラスをいつでも簡単に作成できます。

public class CInfo {
    public String aName;
    public String bName
}

そして、CInfo を使用して C インスタンスを構築します。A と B の名前からインスタンスへのマップが既にあるとすれば、それは簡単です。

于 2011-12-07T02:40:58.170 に答える
1

あなたが説明したことから、XMLを変更するか、XMLからSpring XML構成ファイルを作成するXSTLを生成することにより、Springなどの一般的なフレームワークでこれを行うことができます。

おそらく、 Spring Core のドキュメントで十分に作業を開始できます。XML の例は次のようになります。

<bean id="beanOneId" class="the.bean.Class">
    <property name="someProperty" value="staticValue">
    <property name="someOtherProperty" ref="beanTwoId">
</bean>
<bean id="beanTwoId" class="the.otherbean.Class">
    <property name="someOtherProperty" ref="beanOneId">
    <property name="someOtherProperty" ref="beanThreeId">
</bean>

しかし、あなたが説明することは、反省で難しすぎてはいけません。他のオブジェクトのいずれもコンストラクターで参照を必要としないと仮定すると (むしろ setX として)、xml をスキャンすることから始め、すべてのオブジェクトを作成してその名前で保存し、「接続」のリストを記憶して作成します。すべてのオブジェクトが作成されたら、接続リスト内のすべての接続を行います。

于 2011-12-06T14:06:26.763 に答える