【问题标题】:parsing subnodes with Jersey用 Jersey 解析子节点
【发布时间】:2010-09-14 11:45:25
【问题描述】:

我们正在使用 Jersey 连接到第三方。然后我们想将返回的 xml 提取到我们的类中。这实际上工作正常,除了 xml 中的一个节点位于子节点中。 这是返回的 xml:

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

【问题讨论】:

    标签: java xml jaxb jersey


    【解决方案1】:

    你有几个不同的选择:

    选项 1 - MOXy 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;
        }
    
    }
    

    欲了解更多信息,请参阅:

    【讨论】:

    • 很高兴我能帮上忙。由于您是 SO 新手,一旦找到答案,我们鼓励您将其标记为已接受的答案。
    【解决方案2】:

    我认为您不能像这样使用 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;
        }
    }
    

    请注意,您需要的唯一注释是OurResponse 类上的@XmlRootElement,您需要设置名称; name="response".

    【讨论】:

    • 不幸的是,这对我不起作用。创建了一个 OurResponse 对象并填充了它的字段,但是 subXml 字段仍然为空,并且(显然)没有对 authCode 进行任何操作。 (我更正了 authCode 的大小写以匹配传入的 xml)。
    • 如果您使用@XmlJavaTypeAdapter,您可以利用 SubXml 类来获得所需的 XML 表示,而无需更改您的模型。见stackoverflow.com/questions/3708532/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    相关资源
    最近更新 更多