【问题标题】:JAXB / XStream - Unmarshall Different POJO by particular tagJAXB / XStream - 通过特定标签解组不同的 POJO
【发布时间】:2023-04-30 07:36:01
【问题描述】:

假设我有一个这样的 XML:

<host name="myHost">
  <service>
    <type>TYPE1</type>
    <field1>The content of field 1</field1>
  </service>
  <service>
    <type>TYPE2</type>
    <field2>The content of field 2</field2>
  </service>
</host>

有一种方法(使用 JAXB / XStream)可以说“当您发现使用 TYPE1 服务的元素时,使用类型 1 的 POJO / 当发现使用 TYPE2 服务的元素时,使用类型 2 的 POJO ?

我需要这个来使用通用标签,这个标签的类型会影响在解组过程中使用的 POJO 类

【问题讨论】:

  • 我没有看到任何问题。我确实看到了“有一种方法”的说法,所以如果这是真的,那就用那种方法吧。
  • 我只是忘记在粗体短语上添加问号.....
  • 添加问号并不意味着它是一个问题。 “在那儿 ... ?”是一个问题。 --- JAXB 不能这样做。您必须将 JAXB 创建的类中的数据映射到您的 POJO 类。不知道 XStream。

标签: java xml jaxb xstream


【解决方案1】:

使用 XStream--> 如果服务是列表对象,您将能够以这种格式进行操作...

<Host>
  <name>myHost</name>
  <service>
    <Child1>
      <type>TYPE1</type>
      <field1>The content of field 1</field1>
    </Child1>
    <Child2>
      <type>TYPE2</type>
      <field2>The content of field 2</field2>
    </Child2>
  </service>
</Host>

代码从这里开始

public class BaseObj {
private String type; }


public class Child1 extends BaseObj {
    private String field1;
}
public class Child2 extends BaseObj{
    private String field2;
}
public class Host {
    private String name;
    private List<BaseObj> service
}
public class TestXStream {

    public static void main(String[] args) {
        List<BaseObj> objects = new ArrayList<BaseObj>();
        Child1 obj1 = new Child1();
        obj1.setType("TYPE1");
        obj1.setField1("The content of field 1");
        Child2 obj2 = new Child2();
        obj2.setType("TYPE2");
        obj2.setField2("The content of field 2");
        objects.add(obj1);
        objects.add(obj2);
        Host host = new Host();
        host.setName("myHost");
        host.setService(objects);
        try {
            File test = new File("C:/resources/test_id.xml");
            new XStream().toXML(host, new FileOutputStream(test));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

【讨论】: