java - 使用 Jersey 解析子节点

标签 java xml jaxb jersey

我们正在使用 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;  
    }  
}

最佳答案

您有几个不同的选择:

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

}

更多信息请参见:

关于java - 使用 Jersey 解析子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3708532/

相关文章:

java - ZGC最大堆大小超过物理内存

java - 获取从运行可运行对象的线程创建可运行对象的方法

java - IBM MQ : Any way to get connection interruption notification?

java - 使用 JAXB 处理设计不佳的 XML

java - 每当我尝试在模拟器中运行代码时,它都会显示应用程序不断停止,并且出现错误,我进入 setcontentview(R.layout.Main_activity)

xml - 如何通过 XPath 选择缺少属性值的元素?

java - 从 Web 服务响应中解析单个 XML 节点

xml - SandcaSTLe 文档 xml 代码示例显示无回车

java - EAD xsd 生成的 JAXBException

java - HyperJaxb3 和 xsd :anyType