4

私はこのタイプのXMLを生成するシステムを使用しています。

<address>
  <addressLine>123 Main Street</addressLine>
  <addressLine>Suite 123</addressLine>
  <city>Test City</city>
  <stateOrProvince>AA</stateOrProvince>
  <postalCode>00000</postalCode>
</address>

getAddressLine()2つのaddressLine要素はXStream暗黙的コレクションの一部である必要があります-メソッドを呼び出してList<String>出力を取得したいと思います。

私はXStreamのチュートリアルを使用してきましたが、addressLine要素を正しくマップする方法を完全には理解していません。XStreamのTweakingOutputチュートリアルにも同様の使用例がありますが、サンプルコードは提供されていません。

もう1つのユースケースは、コレクション、配列、およびマップです。クラスにこれらのタイプの1つであるフィールドがある場合、デフォルトでは、そのすべての要素がコンテナオブジェクト自体を表す要素に埋め込まれます。XStream.addImplicitCollection()、、、 XStream.addImplicitArray()およびメソッドを使用してXStreamを構成することによりXStream.addImplicitMap()、要素をクラスの子として直接保持することができ、コンテナーオブジェクトの周囲のタグは省略されます。クラスに対して複数の暗黙的なコレクション、配列、またはマップを宣言することも可能ですが、逆シリアル化時に異なるコンテナーに正しくデータを取り込むには、要素を区別できる必要があります。

次の例では、ファームを表すJavaタイプに2つのコンテナがあります。1つは猫用、もう1つは犬用です。

<farm>
  <cat>Garfield</cat>
  <cat>Arlene</cat>
  <cat>Nermal</cat>
  <dog>Odie</dog>
</farm>

ただし、このSOの回答は、XStreamファームの例が不可能であることを示しています。

このJavaコードを試してJavaコードの単体テストを行いましたが、まだ運がありません。

XStream xstream = new XStream(new StaxDriver());        
xstream.alias("address", Address.class);
xstream.alias("addressLine", String.class);     
xstream.addImplicitCollection(Address.class, "addressLines");       

Address address = (Address) xstream.fromXML( 
    new FileInputStream("src/test/resources/addressTest.xml"));

他に試すべき構成の変更はありますか?

注:現在、XStreamv1.2.2を使用しています。

4

1 に答える 1

11

まず、可能であれば、より新しいXStreamにアップグレードする必要があります-1.2.2は2007年にリリースされました。しかし、質問に答えるには、次のことを試してください。

XStream xstream = new XStream(new StaxDriver());
xstream.alias("address", Address.class);
xstream.addImplicitCollection(Address.class, "addressLines", "addressLine", String.class);

これは、名前を持つすべての要素をaddressLine文字列として扱い、それらをaddressLinesコレクションに収集することを意味します(つまりsomeAddress.getAddressLines())。

于 2012-10-01T21:47:15.270 に答える