2014-01-30 3 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> 

:

@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이다 XML keysList 개체에서 키 목록을 얻었지만 messageId 또는 다른 개체와 같은 다른 개체가 나타나지 않습니다. er <root> 요소.
어떻게 bean 값에서 그 값을 얻을 수 있습니까?

이 문제를 해결하는 데 도움을주십시오.

+0

여기에 출력을 얻기위한 주요 방법은? – 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()); 

    } 

OUTPUT 여기

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)); 
    } 
} 

매핑은 두 개의 내부 클래스, 즉 루트와 키에 대해 분할됩니다.

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()); 
} 

출력은 다음과 같습니다 : 난 내 answer.does는 우려에 답변을 게시 ahve

<?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>