2016-12-15 49 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

相關問題