2010-09-14 28 views
1

我們使用Jersey連接到第三方。然後,我們想要將返回的xml提取到我們的類中。這實際上工作正常,除了在子節點中的xml中的一個節點。 下面是返回的XML:使用Jersey分析子節點

<response> 
... 
<langISO>en</langISO> 
<acquirerAmount>1000</acquirerAmount> 
<acquirerCurrency>GBP</acquirerCurrency> 
<subXml> 
<authCode>122958</authCode> 
</subXml> 
</response> 

注意,AUTHCODE節點是一個子節點(稱爲subXml)。

OurResponse myriadResponse = response.getEntity(OurResponse.class);

這裏是我們班的,但它不解析出AUTHCODE

package com.xxx; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.Path; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
@Consumes("application/xml") 
public class OurResponse { 
    private String authCode; 

    @XmlElement(name = "subXml/authCode") 
    public String getAuthCode() { 
     return authCode; 
    } 

    @XmlElement(name = "subXml/authCode") 
    public void setAuthCode(String authCode) { 
     this.authCode = authCode; 
    } 
} 

回答

1

你有幾個不同的選擇:

選項1 - 莫西JAXB & @XmlPath

您可以使用MOXy JAXB實現和@XmlPath擴展達到預期的效果:

import javax.xml.bind.annotation.XmlRootElement; 
import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement(name="response") 
public class OurResponse { 
    private String authCode; 

    @XmlPath("subXml/authCode/text()") 
    public String getAuthCode() { 
     return authCode; 
    } 

    public void setAuthCode(String authCode) { 
     this.authCode = authCode; 
    } 

} 

欲瞭解更多信息,請參閱:

選項2 - 任何JAXB默認地將Impl和@XmlJavaTypeAdapter

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

@XmlRootElement(name="response") 
public class OurResponse { 
    private String authCode; 

    @XmlJavaTypeAdapter(AuthCodeAdapter.class) 
    @XmlElement(name="subXml") 
    public String getAuthCode() { 
     return authCode; 
    } 

    public void setAuthCode(String authCode) { 
     this.authCode = authCode; 
    } 

} 

import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class AuthCodeAdapter extends XmlAdapter<SubXml, String> { 

    @Override 
    public String unmarshal(SubXml v) throws Exception { 
     return v.getAuthCode(); 
    } 

    @Override 
    public SubXml marshal(String v) throws Exception { 
     SubXml subXml = new SubXml(); 
     subXml.setAuthCode(v); 
     return subXml; 
    } 

} 

public class SubXml { 

    private String authCode; 

    public String getAuthCode() { 
     return authCode; 
    } 

    public void setAuthCode(String authCode) { 
     this.authCode = authCode; 
    } 

} 

欲瞭解更多信息,請參閱:

+0

太棒了!謝謝!選項2正在工作。 – phil 2010-09-15 09:01:32

+0

很高興我能幫到你。既然你是新手,一旦你找到你的答案,我們鼓勵你將其標記爲公認的答案。 – 2010-09-15 09:39:50

0

我不認爲你可以用這樣的XmlElement註釋。您可能需要創建一個單獨的SubXml類;

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="response") 
public class OurResponse 
{ 
    private String lang; 
    private String amt; 
    private String curr; 
    private SubXml subXml; 

    public OurResponse() 
    { 

    } 

    //Getters and setters 
} 

public class SubXml 
{ 
    private String authcode; 

    public SubXml() 
    { 

    } 

    public String getAuthcode() 
    { 
     return authcode; 
    } 

    public void setAuthcode(String authcode) 
    { 
     this.authcode = authcode; 
    } 
} 

請注意,你唯一需要的註釋是@XmlRootElement在OurResponse類,你需要設置的名稱; name="response"

+0

不幸的是,這並不爲我工作。一個OurResponse對象被創建並且它的字段被填充,但是,subXml字段仍然是空的,並且(顯然)沒有任何事情可以用authCode完成。 (我糾正了authCode的外殼以匹配傳入的xml)。 – phil 2010-09-14 14:47:22

+0

如果使用@XmlJavaTypeAdapter,則可以利用SubXml類獲取所需的XML表示而不需要更改模型。見http://stackoverflow.com/questions/3708532/parsing-subnodes-with-jersey/3712287#3712287 – 2010-09-14 20:18:15