2010-09-14 30 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