如何使用SimpleXML框架处理继承?

Rom*_*iel 1 java inheritance android simple-framework

我目前正在使用SimpleXML框架来解析XML文件,我正面临一个经常出现的问题.

收到的XML可以是这样的:

<root>
   <B>
      ...
   </B>
</root>
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

<root>
   <C>
      ...
   </C>
</root>
Run Code Online (Sandbox Code Playgroud)

我希望B和C扩展另一个类,比如A.

使用SimpleXML这样做的整洁方法是:

@Root(name="root")
class Root {

   @Element(name="B", required="false")
   private B b;

   @Element(name="C", required="false")
   private C c;
}

class B extends A {

}

class C extends A {

}
Run Code Online (Sandbox Code Playgroud)

我知道我可以做一些我在SimpleXML文档中找到的东西,改变我的XML格式:

<root>
   <A class="example.B">     // or "example.C"
      ...
   </A>
</root>
Run Code Online (Sandbox Code Playgroud)

然后我的Java类:

@Root(name="root")
class Root {

   @Element(name="A")
   private A a;
}

class B extends A {

}

class C extends A {

}
Run Code Online (Sandbox Code Playgroud)

我真的很喜欢使用这个解决方案,但我不确定是否要在解析它之前完成在客户端更改XML的过程.问题是它无法在服务器端完成,因为我无法控制它.

所以我的问题是:

这是我唯一的解决方案吗?

在这种情况下,你们知道是否有一个快速的解决方案来改变客户端的xml文件?

Rom*_*iel 6

我不知道如何进行继承,但我找到了一个使用接口的解决方案(在我的情况下这是好的)

诀窍是使用:

@Root(name="root")
class Root {

   @ElementUnion({
       @Element(name="B", type=B.class),
       @Element(name="C", type=C.class)
   })
   private A a;
}

interface A {

}

class B implements A {

}

class C implements A {

}
Run Code Online (Sandbox Code Playgroud)

如果我们可以做继承同样的事情会很好.

更新:继承是可用的@ElementUnion.虽然文档中没有指定,但这也有效:

@Root(name="root")
class Root {

   @ElementUnion({
       @Element(name="B", type=B.class),
       @Element(name="C", type=C.class)
   })
   private A a;
}

class A {

}

class B extends A {

}

class C extends A {

}
Run Code Online (Sandbox Code Playgroud)