使用 JAXB 获取 XML 子节点的值

getting the value of an XML subnode using JAXB

我正在尝试使用 JAXB 映射此 XML 文件并获取 CODE 元素的值。最终,完整的 XML 文件将包含许多收费代码块,我需要提取不同标签的所有值,但现在我只想设法获得一个值。

XML:

<?xml version="1.0" encoding="utf-8" ?>
<tpDoc>
  <tpCTRL>
      <DocID>CHARGE CODES</DocID>
      <SenderID>IES</SenderID>
  </tpCTRL>
  <PAYLOAD>
   <CHARGE_CODE>
    <CODE>TEST</CODE>
    <DESCRIPTION>M Test</DESCRIPTION>
    <SALES_ACCOUNT>34535</SALES_ACCOUNT>
    <COSTS_ACCOUNT>500056756745</COSTS_ACCOUNT>
   </CHARGE_CODE>
  </PAYLOAD>
</tpDoc>

这是编组代码:

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(CC.class);

        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        CC chargeCode =  (CC) unmarshaller.unmarshal(inputFile);
        System.out.println();
        System.out.println(chargeCode.getCode());
    }
}

class:

@XmlRootElement(name="tpDoc")
@XmlAccessorType(XmlAccessType.FIELD)
public class CC {

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

然而,我得到的只是空值。我做错了什么?

这应该适合您,您应该能够获得任何值。我用 Project Lombok 代替 Getter and Setter methods。此外,跳过 tpCTRL 的 POJO,您需要添加它们

XML:

<?xml version="1.0" encoding="utf-8" ?>
<tpDoc>
    <tpCTRL>
        <DocID>CHARGE CODES</DocID>
        <SenderID>IES</SenderID>
    </tpCTRL>
    <PAYLOAD>
        <CHARGE_CODE>
            <CODE>TEST</CODE>
            <DESCRIPTION>M Test</DESCRIPTION>
            <SALES_ACCOUNT>34535</SALES_ACCOUNT>
            <COSTS_ACCOUNT>500056756745</COSTS_ACCOUNT>
        </CHARGE_CODE>
    </PAYLOAD>
</tpDoc>

tp文档:

@XmlRootElement(name = "tpDoc")
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class tpDoc {
    @XmlElement(name="PAYLOAD")
    private Payload payload;
}

有效负载;

@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class Payload {
    @XmlElement(name="CHARGE_CODE")
    private ChargeCode chargeCode;
}

费用代码;

@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class ChargeCode {
    private String CODE;
    private String DESCRIPTION;
    private String SALES_ACCOUNT;
    private String COSTS_ACCOUNT;
}

主要内容:

public class Main {
    public static void main(String[] args) throws JAXBException, XMLStreamException {
        final InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("sample.xml");
        final XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream);
        final Unmarshaller unmarshaller = JAXBContext.newInstance(tpDoc.class).createUnmarshaller();
        final tpDoc tpDoc = unmarshaller.unmarshal(xmlStreamReader, tpDoc.class).getValue();
        System.out.println(tpDoc.toString());
        System.out.println(tpDoc.getPayload().getChargeCode().getCODE());
        System.out.println(tpDoc.getPayload().getChargeCode().getCOSTS_ACCOUNT());

        Marshaller marshaller = JAXBContext.newInstance(tpDoc.class).createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        marshaller.marshal(tpDoc, System.out);
    }
}

输出如下;

tpDoc(payload=Payload(chargeCode=ChargeCode(CODE=TEST, DESCRIPTION=M Test, SALES_ACCOUNT=34535, COSTS_ACCOUNT=500056756745)))
TEST
500056756745
<tpDoc>
   <PAYLOAD>
      <CHARGE_CODE>
         <CODE>TEST</CODE>
         <DESCRIPTION>M Test</DESCRIPTION>
         <SALES_ACCOUNT>34535</SALES_ACCOUNT>
         <COSTS_ACCOUNT>500056756745</COSTS_ACCOUNT>
      </CHARGE_CODE>
   </PAYLOAD>
</tpDoc>