2017-06-26 12 views
0

XMLからJavaオブジェクトを作成する方法を学び始めました。しかし、今私はトリッキーな入力を持っており、私はそれを解決する方法を本当に知りません。Javaでxmlファイルを読む - 選択した要素のみ

これは、入力された:

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

を、私のためには、ヌルとして来ている(productvalue)xmlに4つのタグproductvalueがあるので、私はそれがあるのだろうか(私はtipovaluePrd.cd_value4です)が必要です。以下は

私はXMLを解析するために使用している方法です。特に私は(tipovaluePrd.cd_value = 4を持ってproductvalue要素を)したい値を読み取るための方法があるかどうか、私は疑問に思う、だから、

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

とどのようにできました私がする。そうでなければ、私はクラスをどのようにしてすべてを正しく読むことができるのでしょうか?入力を変更

は...ここに任意の助けを事前に

おかげオプションではありません。

+1

あなたは必要ありません:EclipseLinkのJAXBの実装を使用すると、XPathの要求に応じてオブジェクトをバインドすることができます@XmlPath注釈を実装しています:あなたはJAXBの実装を変更するために喜んでいる場合

  • これのためにjaxb。 javax.xml.xpathを使用することができます。 – SomeDude

  • 答えて

    1

    実際には、現在の設定で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であることを確認します。

    これで、すべてのproductvalue要素のリストが作成されます。あなたはそれから興味のあるproductvalueを取得するだけです。

    あなただけが持つ興味を持っている要素を取得したい場合:swasaはあなたのXMLのXpathの要求を行うjavax.xml.xpathのを使用することができ、それを示唆したように

    1. を。

      @XmlPath(name = "productvalue/tipovaluePrd[@cd_value=4]") 
      private ProductValueType productValueType;
    関連する問題