2014-10-17 53 views
2

我有XML如下JAVA/JAXB:元帥/解組使用屬性在XML或類成員

<request type="1"> 
    <request-header/> 
    <request-details> 
    <!-- Some more tags --> 
    </request-details> 
</request> 

對於映射此XML我有類結構如下:

public class Request1 
{ 
    private RequestDetail_1; 
    //other members 
} 

public class Request2 
{ 
    private RequestDetail_2; 
    //other members 
} 

public class RequestDetail_1 
{ 
    //members 
} 

public class RequestDetail_2 
{ 
    //Members 
} 

我想要做的是...如果屬性類型是1,那麼我需要創建Request_1類型的對象,如果類型是2,那麼對象類型將是Request_2等等。

我已經通過this鏈接作爲參考,但仍然無法找到一種方法來做到這一點。我想用純JAXB,而不是MOXY或任何其他這樣的框架工作... :(

部分代碼:

@XmlJavaTypeAdapter(RequestAdaptor.class) 
@XmlRootElement(name="request") 
public class AuthRequest extends Request 
{ 
    private AuthRequestDetails requestDetails; 

    public RequestDetails getRequestDetails() 
    { 
     return requestDetails; 
    } 

    @Override 
    public void setRequestDetails(RequestDetails requestDetails) 
    { 
     this.requestDetails = (AuthRequestDetails)requestDetails; 
    } 
} 

@XmlAccessorType(XmlAccessType.FIELD) 
public class AuthRequestDetails extends RequestDetails 
{ 
    @XmlElement(name="user-name") 
    private String userName; 
    @XmlElement(name="password") 
    private String password; 

    public String getUserName() { 
     return userName; 
    } 

    public void setUserName(String userName) { 
     this.userName = userName; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 
} 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlJavaTypeAdapter(RequestAdaptor.class) 
public abstract class Request 
{ 
    @XmlAttribute 
    protected String type; 

    @XmlElement(name="request-header") 
    protected RequestHeader requestHeader; 

    public RequestHeader getRequestHeader() 
    { 
     return requestHeader; 
    } 

    public void setRequestHeader(RequestHeader requestHeader) 
    { 
     this.requestHeader = requestHeader; 
    } 

    public String getType() 
    { 
     return type; 
    } 

    public void setType(String type) 
    { 
     this.type = type; 
    } 

    public abstract void setRequestDetails(RequestDetails requestDetails); 

    public abstract RequestDetails getRequestDetails(); 


} 

public class RequestAdaptor extends XmlAdapter<RequestDTO, Request> 
{ 
    @Override 
    public RequestDTO marshal(Request v) throws Exception 
    { 
     System.out.println("marshal"); 
     RequestDTO lRequestDTO= new RequestDTO(); 
     lRequestDTO.setRequestHeader(v.getRequestHeader()); 
     lRequestDTO.setType(v.getType()); 
     if(v.getType().equals("5")) 
     { 
      AuthRequest lRequest = (AuthRequest)v; 

     } 
     else 
     { 
      PingRequest lRequest = (PingRequest)v; 
     } 
     return lRequestDTO; 
    } 

    @Override 
    public Request unmarshal(RequestDTO v) throws Exception 
    { 
     System.out.println("unmarshal"); 
     if(v.getType().equals("5")) 
     { 
      AuthRequest lRequest = new AuthRequest(); 
      lRequest.setRequestHeader(v.getRequestHeader()); 
      lRequest.setType(v.getType()); 
      return lRequest; 
     } 
     else 
     { 
      PingRequest lRequest = new PingRequest(); 
      lRequest.setRequestHeader(v.getRequestHeader()); 
      lRequest.setType(v.getType()); 
      return lRequest; 
     } 
    } 

} 
@XmlAccessorType(XmlAccessType.FIELD) 
public class RequestDTO 
{ 
    @XmlAttribute 
    protected String type; 

    @XmlElement(name="request-header") 
    private RequestHeader requestHeader; 

    @XmlElement(name="request-details") 
    private RequestDetails requestDetails; 

    public RequestHeader getRequestHeader() 
    { 
     return requestHeader; 
    } 

    public void setRequestHeader(RequestHeader requestHeader) 
    { 
     this.requestHeader = requestHeader; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    public RequestDetails getRequestDetails() { 
     return requestDetails; 
    } 

    public void setRequestDetails(RequestDetails requestDetails) { 
     this.requestDetails = requestDetails; 
    } 

} 

@XmlAccessorType(XmlAccessType.FIELD) 
public class RequestHeader 
{ 
    @XmlElement(name="name") 
    String Name; 

    public String getName() { 
     return Name; 
    } 

    public void setName(String name) { 
     Name = name; 
    } 

} 

的第一件事是:元帥和適配器的解組是沒有得到所謂的我。在這一點卡住了

+0

在你連接的問題中給出的答案不使用Moxy。 「@ XmlJavaTypeAdapter」的用法是純JAXB。 – Victor 2014-10-17 07:58:11

+0

@勝利者這個答案在這裏也不相關。更新:我錯了,它是相關的。 – lexicore 2014-10-17 08:39:18

+0

[Java/JAXB:Unmarshall XML屬性到特定Java對象屬性]的可能重複(http://stackoverflow.com/questions/3284786/java-jaxb-unmarshall-xml-attributes-to-specific-java-object-attributes ) – lexicore 2014-10-17 08:40:20

回答

0

您可以使用StAX XmlStreamReader來解析XML,然後將其推進到根元素,當它位於根元素事件時,請檢查type屬性的值。 Class你應該通過unmarshal方法,需要一個ClassXmlStreamReader以獲得您要查找的結果。

+1

This Works ...謝謝。 – 2014-10-21 05:03:49