2016-12-15 50 views
0

我想要序列下面的XML响应转换成一个List<String>对象:如何使用JAXB将具有不同元素名称的列表序列化为一个列表?

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

像:

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

那是不可能的?

背景:我无法控制的web服务在XML响应中提供了多个“列表”。但是在这些列表中,这些监听是用索引来命名的,如a20。我不希望jaxb为此生成20个bean属性。

回答

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 
+0

列表的对象是什么instanceof? 您正在将它转换为'ElementNSImpl'进行sysout。他们总是那种类型?如果是这样,我是否也可以在我的bean中写入'List any;'? – membersound

+0

是的,它是'ElementNSImpl',因为类型是未知的。您可以使用'getOwnerDocument'获取元素的DOM,并对其进行处理。 'org.w3c.dom.Document document = elementNsimpl.getOwnerDocument()' – ulab

相关问题