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