2014-01-30 55 views
0

我有一個XML字符串,並且我想使用JAXB API將其解組爲Java Bean。
下面是XML:通過JAXB在Unmarshal XML中缺少一些價值

<?xml version="1.0" encoding="UTF-8"?> 
    <ns0:TEST_REQ xmlns:ns0="http://Test.com"> 
    <keys> 
     <item> 
      <key>MyKey1</key>  
     </item> 
     <item> 
      <key>MyKey2</key>  
     </item> 
    </keys> 
    <root> 
     <messageid>000000123<messageid/> 
     <statusmessage>Successfully Done.</statusmessage> 
     <statuscode>1</statuscode> 
    </root> 
</ns0:TEST_REQ> 

我想解組此XML下面的Java Bean:

@XmlRootElement(name = "TEST_REQ", namespace = "http://Test.com") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class ResponseKeysBean { 

    @XmlElement(name="messageid") 
    private String messageId; 

    @XmlElement(name="statuscode") 
    private Integer statusCode; 

    @XmlElement(name="statusmessage") 
    private String statusMessage; 

    @XmlElement(name="key") 
    private String key; 

    @XmlElementWrapper(name="keys") 
    @XmlElement(name="item") 
    private List<ResponseKeysBean> keysList; 

    //Getter and Setter method 
} 

我解組此XML使用下面的代碼:

JAXBContext jaxbContext = JAXBContext.newInstance(ResponseKeysBean.class); 
Unmarshaller um = jaxbContext.createUnmarshaller(); 
ResponseKeysBean keyObj = (ResponseKeysBean) um.unmarshal(new StringReader(xmlStr)); 

當我在上面散集XML我得到了keysList對象中的關鍵列表,但是我沒有在我的對象中獲得其他參數,如messageId或其他是呃<root>元素。
我如何在我的bean變量中獲得這些值。

請幫我解決這個問題。

+0

我ahve張貼了我answer.does它回答您的問題? – Prateek

回答

2

您尚未正確創建ResponseKeysBean類。像這樣做:

import java.util.List; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name = "TEST_REQ", namespace = "http://Test.com") 
@XmlAccessorType(XmlAccessType.PROPERTY) 
public class ResponseKeysBean { 

    private Keys keyList; 
    private Root status; 

    public ResponseKeysBean() { 
     // TODO Auto-generated constructor stub 
    } 

    @XmlElement(name="keys") 
    public Keys getKeyList() { 
     return keyList; 
    } 

    public void setKeyList(Keys keyList) { 
     this.keyList = keyList; 
    } 

    @XmlElement(name="root") 
    public Root getStatus() { 
     return status; 
    } 

    public void setStatus(Root status) { 
     this.status = status; 
    } 
} 

class Root { 
    private String messageId; 
    private Integer statusCode; 
    private String statusMessage; 

    @XmlElement(name="messageid") 
    public String getMessageId() { 
     return messageId; 
    } 

    public void setMessageId(String messageId) { 
     this.messageId = messageId; 
    } 

    @XmlElement(name="statuscode") 
    public Integer getStatusCode() { 
     return statusCode; 
    } 

    public void setStatusCode(Integer statusCode) { 
     this.statusCode = statusCode; 
    } 

    @XmlElement(name="statusmessage") 
    public String getStatusMessage() { 
     return statusMessage; 
    } 

    public void setStatusMessage(String statusMessage) { 
     this.statusMessage = statusMessage; 
    } 

    @Override 
    public String toString() { 
     return "Root [messageId=" + messageId + ", statusCode=" + statusCode 
       + ", statusMessage=" + statusMessage + "]"; 
    } 


} 

class Keys { 
    private List<Item> keysList; 

    public Keys() { 
     // TODO Auto-generated constructor stub 
    } 

    @XmlElement(name="item") 
    public List<Item> getKeysList() { 
     return keysList; 
    } 

    public void setKeysList(List<Item> keysList) { 
     this.keysList = keysList; 
    } 

    @Override 
    public String toString() { 
     return "Keys [keysList=" + keysList + "]"; 
    } 
} 

class Item { 

    private String key; 

    @XmlElement(name="key") 
    public String getKey() { 
     return key; 
    } 

    public void setKey(String key) { 
     this.key = key; 
    } 

    @Override 
    public String toString() { 
     return "Item [key=" + key + "]"; 
    } 
} 

然後從主類中調用它是這樣的:

public static void main(String[] args) throws JAXBException, FileNotFoundException{ 
     JAXBContext jaxbContext = JAXBContext.newInstance(ResponseKeysBean.class); 
     Unmarshaller um = jaxbContext.createUnmarshaller(); 
     ResponseKeysBean keyObj = (ResponseKeysBean) um.unmarshal(new FileReader(new File("./configurationfiles/testconfig.xml"))); 

     System.out.println(keyObj.getKeyList()); 
     System.out.println(keyObj.getStatus()); 

    } 

輸出

Key List is : Keys [keysList=[Item [key=MyKey1], Item [key=MyKey2]]] 
Status is : Root [messageId=000000123, statusCode=1, statusMessage=Successfully Done.] 
+0

有沒有其他方法可以保留一個類中的所有屬性? –

+0

根據我的知識,沒有其他的方式。在你的情況下,鍵和根標籤還有子元素,所以他們需要有自己的實現。 – Prateek

+0

@Yagnesh看看我更新的答案 – Prateek

1

這裏是獲取所需的XML輸出的完整ResponseKeyBean類。

@XmlRootElement(name = "TEST_REQ", namespace = "http://Test.com") 
@XmlAccessorType(XmlAccessType.FIELD) 
public static class ResponseKeysBean { 
    static class Root { 
     @XmlElement(name="messageid") 
     private String messageId; 
     @XmlElement(name="statuscode") 
     private Integer statusCode; 
     @XmlElement(name="statusmessage") 
     private String statusMessage; 
     public Root() { 
     } 
    } 
    @XmlElement(name="root") 
    private Root root; 
    @XmlElementWrapper(name="keys") 
    @XmlElement(name="key") 
    private List<Key> keys; 
    @XmlAccessorType(XmlAccessType.FIELD) 
    static class Key { 
     @XmlElement(name="item") 
     private List<String> key = new ArrayList<>(); 
     public Key() {} 
     public Key(String value) { 
      this.key.add(value); 
     } 
    } 
    public ResponseKeysBean() { 
     this.keys = new ArrayList<>(); 
     this.root = new Root(); 
    } 
    public ResponseKeysBean(String messageId, Integer statusCode, String statusMessage) { 
     this(); 
     this.root.messageId = messageId; 
     this.root.statusCode = statusCode; 
     this.root.statusMessage = statusMessage; 
    } 
    public void addKey(String key) { 
     this.keys.add(new Key(key)); 
    } 
} 

映射被分成兩個內部類,一個用於Root,一個用於Key。

這裏是讓輸出的主要方法:

public static void main(String[] args) throws Exception { 
    ResponseKeysBean bean = new ResponseKeysBean("000000123",1,"Successfully Done."); 
    bean.addKey("MyKey1"); 
    bean.addKey("MyKey2"); 
    JAXBContext jaxbContext = JAXBContext.newInstance(ResponseKeysBean.class); 
    Unmarshaller um = jaxbContext.createUnmarshaller(); 
    Marshaller ma = jaxbContext.createMarshaller(); 
    StringWriter result = new StringWriter(); 
    ma.marshal(bean, result); 
    System.out.println(result.toString()); 
} 

輸出是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><ns2:TEST_REQ xmlns:ns2="http://Test.com"><root><messageid>000000123</messageid><statuscode>1</statuscode><statusmessage>Successfully Done.</statusmessage></root><keys><key><item>MyKey1</item></key><key><item>MyKey2</item></key></keys></ns2:TEST_REQ>