3

XML ファイルの解析にSimple XML Frameworkを使用しています。

サーバーから、次のような XML ファイルを受け取ります。

<Objects>
   <Object type="A">
      <name></name>
      <color></color>
   </Object>
   <Object type="B">
      <shape></shape>
      <weight></weight>
   </Object>
<Objects>

インターフェイス (またはスーパークラス) Objectと 2 つのサブクラスABがあります。

この XML ドキュメントをデシリアライズすることは可能ですか?

クラス属性を持つサブクラスを区別する可能性があることをチュートリアルで見ましたが、残念ながらこれは私には不可能です。フレームワークが type 属性に基づいて適切なサブクラスを選択することを選択する方法はありますか?

Android を使用しているため、別のフレームワーク (JAXB など) を使用できません。

4

2 に答える 2

1

XML にわずかな変更を加えることを厭わない場合は、単純な XML でもそれを行うことができます。したがって、この例では、その xml を次のように変更できます。

<Objects>
   <A>
      <name></name>
      <color></color>
   </A>
   <B>
      <shape></shape>
      <weight></weight>
   </B>
<Objects>

そして、次の Java を使用できます。

@ElementListUnion({
    @ElementList(entry = "A", inline = true, type = A.class),
    @ElementList(entry = "B", inline = true, type = B.class)
}
private List<BaseClass> objects;

そして、それだけです。属性に基づいてできるとは思いませんが。私は間違っているかもしれませんが、そのドキュメントを読みたいと思うかもしれません。

于 2011-07-31T05:03:59.860 に答える
0

次のように class 属性を使用できない場合、これを行うのは難しいでしょう。

<Objects>
  <Object class="ObjectA">
    <name></name>
    <color></color>
  </Object>
  <Object class="ObjectB">
    <shape></shape>
    <weight></weight>
  </Object>
<Objects>

単純な XML デシリアライザーに渡す前に、正規表現を使用して属性type="A"と属性をクラスに置き換えるのはなぜですか? type="B"例えば:

xml = xml.replaceAll("type=\"([A-Za-z0-9_]+)\", "class=\"$1\"");

このトリックを使用して、.NET の XML シリアライザーによって生成された XML を解析できました。このシリアライザーは、この属性を使用して、xsi:typeこのようなポリモーフィック リスト内の特定のクラス タイプを示します。

于 2012-03-13T11:17:53.743 に答える