使用Simple XML Framework实现继承

3
我将使用Simple XML Framework来解析XML文件。
从服务器收到的XML文件如下:
<Objects>
   <Object type="A">
      <name></name>
      <color></color>
   </Object>
   <Object type="B">
      <shape></shape>
      <weight></weight>
   </Object>
<Objects>

我有一个接口(或超类)Object和两个子类AB

是否可能将此XML文档反序列化?

我在教程中看到了一种通过 class 属性区分子类的可能性,但不幸的是这对我不起作用。 有没有一种方法可以选择框架根据类型属性选择正确的子类?

我不能使用其他框架(如JAXB),因为我使用的是Android。

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;

那就是所有的内容了。虽然我不认为可以基于属性完成这个操作。但我可能错了,你可能需要阅读文档来了解相关信息。


0

如果您不能使用class属性,那么这可能会很棘手:

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

为什么要在将 XML 数据传递给简单的 XML 反序列化器之前,使用正则表达式将 type="A"type="B" 属性替换为类?例如:
xml = xml.replaceAll("type=\"([A-Za-z0-9_]+)\", "class=\"$1\"");

我能够使用这个技巧解析由.NET的XML序列化器生成的XML,该序列化器使用属性xsi:type来指示多态列表中特定的类类型,例如此列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接