如何使用JAXB将具有不同元素名称的列表序列化到一个列表中?

时间:2016-12-15 14:56:31

标签: java xml jaxb

我想将以下xml响应序列化为一个List<String>对象:

<result>
    <a1/>
    <a2/>
    ...
    <a20/>
</result>

像:

public class Result { 
     //should contain a1... a20
     private List<String> list;
}

这可能吗?

背景:我无法控制的网络服务在XML响应中提供了几个“列表”。但是在这些列表中,侦听器以索引命名,如a20。我不希望jaxb为此生成类似20个bean的属性。

1 个答案:

答案 0 :(得分:1)

不能直接作为java.lang.String。然而,像下面的一些转换可以做到这一点。

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "any"
    })
    @XmlRootElement(name = "result")
    public class Result {

        @XmlAnyElement(lax = true)
        public List<Object> any;

        public List<Object> getAny() {
            if (any == null) {
                any = new ArrayList<Object>();
            }
            return this.any;
        }
}

解析代码:

Result rs = (Result) JAXBUtils.generateObjects(...) // unmarshalling code.

for(Object s : result.getAny()) {
          System.out.println("response: " + ((ElementNSImpl)s).getTextContent());
   }

示例:

sample.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<result>
    <a1>one</a1>
    <a2>two</a2>
    <a20>three</a20>
</result>

<强>输出:

response: one
response: two
response: three