使用 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>
我正在尝试使用 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>