[英]Missing some value in Unmarshal XML via JAXB
我有一個XML字符串,我想使用JAXB API解組到Java Bean。
以下是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變量中獲得這些值。
請幫助我解決此問題。
您尚未正確創建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 + "]";
}
}
然后在您的Main class中這樣調用它:
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.]
這是用於獲取所需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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.