使用JAXB获取XML子节点CODE值时返回null,应如何排查问题?
错误原因
你的实体类结构没有匹配XML的嵌套层级:CODE、DESCRIPTION等节点不是根节点<tpDoc>的直接子元素,它的完整层级路径为tpDoc > PAYLOAD > CHARGE_CODE > CODE。你直接在根节点对应的实体类中声明CODE作为直接子元素,JAXB找不到对应节点,所以返回null。
修复方案
按照XML的层级定义对应的实体类即可:
1. 定义CHARGE_CODE节点对应的实体类
@XmlAccessorType(XmlAccessType.FIELD) public class ChargeCode { @XmlElement(name = "CODE") private String code; @XmlElement(name = "DESCRIPTION") private String description; @XmlElement(name = "SALES_ACCOUNT") private String salesAccount; @XmlElement(name = "COSTS_ACCOUNT") private String costsAccount; public String getCode() { return code; } // 按需补充其他字段的getter、setter }
2. 定义PAYLOAD节点对应的实体类
@XmlAccessorType(XmlAccessType.FIELD) public class Payload { @XmlElement(name = "CHARGE_CODE") private ChargeCode chargeCode; // 后续如果有多个CHARGE_CODE,将上面字段改为 List<ChargeCode> 即可 public ChargeCode getChargeCode() { return chargeCode; } }
3. 定义根节点tpDoc对应的实体类
@XmlRootElement(name = "tpDoc") @XmlAccessorType(XmlAccessType.FIELD) public class TpDoc { @XmlElement(name = "PAYLOAD") private Payload payload; public Payload getPayload() { return payload; } }
4. 修改反序列化逻辑
public class XMLtoJava { public static void main(String[] args) throws JAXBException { File inputFile = new File("C:\\Users\\Inbar\\OneDrive\\OneDrive - alfacloud.co.il\\MSF\\Developments\\OrdertoCashThirdPartyProcess(B2B)\\MSF XMLFiles\\ChargeCodesSmall.XML"); JAXBContext jaxbContext = JAXBContext.newInstance(TpDoc.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); TpDoc tpDoc = (TpDoc) unmarshaller.unmarshal(inputFile); System.out.println(tpDoc.getPayload().getChargeCode().getCode()); } }
修改后运行即可正常输出TEST。
内容的提问来源于stack exchange,提问作者gbasic
相关产品推荐
相关产品推荐

