代码之家  ›  专栏  ›  技术社区  ›  Leonardo Alves Machado Vivek Kumar

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

  •  0
  • Leonardo Alves Machado Vivek Kumar  · 技术社区  · 7 年前

    这是输入:

    <?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
    }
    

    tipovaluePrd.cd_value 4

    下面是我用来解析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;
        }
      }
    

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

    更改输入不是这里的选项。。。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Dimpre Jean-Sébastien    7 年前

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

    缺少表示根元素的类:

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

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

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

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

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

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