gpt4 book ai didi

java - 在Java中读取xml文件 - 仅选定的元素

转载 作者:行者123 更新时间:2023-12-02 12:46:15 26 4
gpt4 key购买 nike

我刚刚开始学习如何从 XML 生成 java 对象。然而,现在我有一个棘手的输入,我真的不知道如何解决它。

这是输入:

<?xml version="1.0" encoding="UTF-8"?>
<return>
<productChange cd_product="711" ds_product="MBL40337 I151 BLACK P" cd_species="UN" cd_tipi="61062000" cd_cst="5" qt_weight="" cd_nbm="" dt="2016-05-04 11:47:36">
<productvalue cd_company="1" cd_product="711" tp_value="P" cd_value="1" vl_product="61.39">
<tipovaluePrd tp_value="P" cd_value="1" ds_value="SALE" cd_corrency="1" />
</productvalue>
<productvalue cd_company="1" cd_product="711" tp_value="P" cd_value="4" vl_product="129.8">
<tipovaluePrd tp_value="P" cd_value="4" ds_value="SALE STORE" cd_corrency="1" />
</productvalue>
<productvalue cd_company="1" cd_product="711" tp_value="P" cd_value="5" vl_product="64.9">
<tipovaluePrd tp_value="P" cd_value="5" ds_value="SALE AT" cd_corrency="1" />
</productvalue>
<productvalue cd_company="1" cd_product="711" tp_value="P" cd_value="8" vl_product="122.78">
<tipovaluePrd tp_value="P" cd_value="8" ds_value="SALE FQ" cd_corrency="1" />
</productvalue>
</productChange>
</return>

为了使用 JaxB(第三方公司提供的 XML)使用此 xml,我构建了以下类:

@XmlAccessorType(XmlAccessType.FIELD)
public class ProductUpdateResponse {

@XmlAttribute(name = "cd_product")
private Integer productCode;
@XmlAttribute(name = "ds_product")
private String productDescription;
@XmlAttribute(name = "cd_species")
private String productSpecie;
@XmlAttribute(name = "cd_tipi")
private Integer productTIPI;
@XmlAttribute(name = "cd_cst")
private Integer productCST;
@XmlAttribute(name = "qt_weight")
private String productWeight;
@XmlAttribute(name = "cd_nbm")
private String productNBM;
@XmlAttribute(name = "dt")
private String productDate;

@XmlElement(name = "productvalue")
private ProductValueType productValue;
// getters and setters
}

@XmlAccessorType(XmlAccessType.FIELD)
public class ProductValue {
@XmlAttribute(name = "cd_product")
private Integer productCode;
@XmlAttribute(name = "cd_company")
private Integer companyCode;
@XmlAttribute(name = "tp_value")
private String valueType;
@XmlAttribute(name = "cd_value")
private Integer valueCode;
@XmlAttribute(name = "vl_product")
private BigDecimal productValue;

@XmlElement(name = "tipovaluePrd")
private ProductValueType productValueType;
//getters and seters
}

@XmlAccessorType(XmlAccessType.FIELD)
public class ProductValueType {
@XmlAttribute(name = "tp_value")
private String valueType;
@XmlAttribute(name = "cd_value")
private String valueCode;
@XmlAttribute(name = "ds_value")
private String valueDescription;
@XmlAttribute(name = "cd_corrency")
private Integer valueCurrency;
//getters and seters
}

但是,对我来说,主要信息是 null (productvalue) 我想知道这是否是因为 xml 中有四个标签productvalue(我只需要 tipovaluePrd.cd_value4 )。

下面是我用来解析 XML 的方法:

private ProductUpdateResponse buildResponse(String rawResponse, Class<T> responseClass) {

JAXBContext jaxbContext = null;
try {
jaxbContext = JAXBContext.newInstance(responseClass);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(rawResponse);
return (ProductUpdateResponse) unmarshaller.unmarshal(reader);
} catch (JAXBException | ClassCastException e) {
return null;
}
}

所以,我想知道是否有一种方法可以专门读取我想要的值(具有 tipovaluePrd.cd_value = 4productvalue 元素),我该怎么做。如果没有,我应该如何构建我的类以便我可以正确阅读所有内容?

此处无法更改输入...

预先感谢您的帮助。

最佳答案

实际上,我很惊讶您使用当前的设置从 JAXB 获得了结果。

您缺少代表根元素的类:

@XmlRootElement(name="return")
@XmlAccessorType(XmlAccessType.FIELD)
public class Return {
@XmlElement(name="productchange")
private ProductUpdateResponse response;

//getters and setters
}

此外,在您的 ProductUpdateResponse 类中,您应该更改:

@XmlElement(name = "productvalue")
private ProductValueType productValue;

@XmlElement(name = "productvalue")
private List<ProductValue> productValues;

最后,在 buildResponse 方法中,确保 responseClass 参数为 Return.class。

有了这个,您应该有一个包含所有产品值(value)元素的列表。您只需从中获取您感兴趣的产品值(value)即可。

如果您只想获取您感兴趣的元素:

  1. 正如 swasa 所建议的,您可以使用 javax.xml.xpath 对 XML 发出 Xpath 请求。

  2. 如果您愿意更改 JAXB 实现:EclipseLink JAXB 实现实现了 @XmlPath 注释,允许您根据 XPath 请求绑定(bind)对象:

    @XmlPath(name = "productvalue/tipovaluePrd[@cd_value=4]")private ProductValueType productValueType;

关于java - 在Java中读取xml文件 - 仅选定的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44764739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com