Java JAXB从XML中解组空值
我在尝试将值从XML提取到Java时遇到了一些问题。我的XML文件输入示例:
<?xml version="1.0" encoding="UTF-8" ?>
<TRB_TRX xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<HEADER ReqNotf="N" TransactionCode="L9_BLACKLIST_SET" PublisherApplID="CL" PublisherApplThreadID="1" EntityId="58241962" RoutingId="2626289" EntityType="ACCOUNT" IssueDate="2019-06-18T23:59:59" EffectiveDate="2019-06-18T23:59:59"/>
<DATA>
<BlacklistCodeSet>
<TransactionHeaderInfoExt>
<ApplicationId>CL</ApplicationId>
<RequestDate>2019-06-18T23:59:59</RequestDate>
</TransactionHeaderInfoExt>
<ClEntityIdInfoExt>
<EntityId>58241962</EntityId>
<EntityType>ACCOUNT</EntityType>
</ClEntityIdInfoExt>
<GeneralCollectionEntityInfoExt>
<BlacklistCode>D</BlacklistCode>
</GeneralCollectionEntityInfoExt>
</BlacklistCodeSet>
</DATA>
</TRB_TRX>
XML文件的我的Java类:
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="BlacklistCodeSet")
public class BlackListCode {
String entityId;
String blackListCode;
public String getEntityId() {
return entityId;
}
public void setEntityId(String entityId) {
this.entityId = entityId;
}
public String getBlackListCode() {
return blackListCode;
}
public void setBlackListCode(String blackListCode) {
this.blackListCode = blackListCode;
}
@Override
public String toString() {
return "BlackListCode{" +
"entityId='" + entityId + '\'' +
", blackListCode='" + blackListCode + '\'' +
'}';
}
}
我的代码用于提取值:
XMLInputFactory xif = XMLInputFactory.newFactory();
FileReader reader = new FileReader("src/main/resources/xml/blacklistcode.xml");
XMLStreamReader xsr = xif.createXMLStreamReader(reader);
try {
JAXBContext jc = JAXBContext.newInstance(BlackListCode.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
while (xsr.hasNext()) {
while (xsr.hasNext() && (!xsr.isStartElement() || !xsr.getLocalName().equals("BlacklistCodeSet"))) {
xsr.next();
}
if (xsr.hasNext()) {
BlackListCode blacklistcode = (BlackListCode) unmarshaller.unmarshal(xsr);
log.debug("BLACKLIST CODE IS " + blacklistcode);
log.debug("ACCOUNT NO IS " + blacklistcode.getEntityId());
}
}
}catch (Exception e){
e.printStackTrace();
}
在提取值之前,我尝试循环节点,直到它与“BlacklistCodeSet”匹配。但是,打印出来的值为空,并且没有抛出错误消息
有什么想法吗?谢谢
# 1 楼答案
为了让JAXB在此时解析到该类中,
<BlacklistCodeSet>
的XML必须是:如果创建
BlackListCode
的实例并使用JAXB将其转换为XML,您自己就可以看到这一点。这是“调试”JAXB的最佳方式如您所见,JAXB所需的XML与您提供给JAXB的实际XML有很大不同。这些元素甚至都没有正确命名,以小写字母开头,因此需要指定
@XmlElement
注释来正确命名它们,并且需要额外的对象来获得更复杂的XML测试
输出
既然生成的XML与预期的XML匹配,JAXB就可以正确地将XML解组到对象中