3

我正在使用Simple XML Framework来解析 XML 文件。

我从服务器收到一个 XML 文件,如下所示:

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

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

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

我在教程中看到可以区分具有类属性的子类,但不幸的是,这对我来说是不可能的。有没有办法选择框架在类型属性的基础上选择正确的子类?

我不能使用另一个框架(如 JAXB),因为我使用的是 Android ..

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>

为什么在将其提供给 Simple 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 回答