1

我目前正在使用SimpleXML框架来解析 XML 文件,并且遇到了一个反复出现的问题。

接收到的 XML 可以是这样的:

<root>
   <B>
      ...
   </B>
</root>

或类似的东西:

<root>
   <C>
      ...
   </C>
</root>

我希望 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 {

}

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

<root>
   <A class="example.B">     // or "example.C"
      ...
   </A>
</root>

然后是我的 Java 类:

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

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

class B extends A {

}

class C extends A {

}

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

所以我的问题是:

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

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

4

1 回答 1

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 {

}

如果我们可以对继承做同样的事情,那就太好了。

更新:继承可以使用@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 {

}
于 2012-04-26T15:48:29.597 回答