简体   繁体   中英

Unmarshallizing XML Java JAXB

XML is :

<?xml version="1.0" encoding="UTF-8"?><products>
<product>

    <imagesurl>
    <imageurl><![CDATA[http://...]]></imageurl>
    <imageurl><![CDATA[http://...]]></imageurl>
    </imagesurl>

</product>
</products>

Then i have 3 classes to parse XML :

The main is:

@XmlRootElement(name = "products")
public class XmlModelRoot {

    private ArrayList<ProductModel> productModels;

    public ArrayList<ProductModel> getProductModels() {
        return productModels;
    }

    @XmlElement(name = "product")
    public void setProductModels(ArrayList<ProductModel> productModels) {
        this.productModels = productModels;
    }


}

The Product class is:

@XmlRootElement(name = "product")
public class ProductModel {
private ArrayList<ImageUrlModel> imagesUrlModels;
public ArrayList<ImageUrlModel> getImagesUrlModels() {
        return imagesUrlModels;
    }

    @XmlElement(name = "imagesurl")
    public void setImagesUrlModels(ArrayList<ImageUrlModel> imagesUrlModels) {
        this.imagesUrlModels = imagesUrlModels;
    }
}

And finaly i have Class for list of URLs :

@XmlRootElement(name = "imagesurl")
public class ImageUrlModel {

    private String imageurl;

    public String getImageurl() {
        return imageurl;
    }

    @XmlElement(name = "imagurl")
    public void setImageurl(String imageurl) {
        this.imageurl = imageurl;
    }
}

My issue is, that i should receive ArrayList<ImageUrlModel> with at last 2 urls, but no matter how many imageurl tags i have, the size of ArrayList<ImageUrlModel> list is only 1 and there is only last tag accessible.

What should i change to have all imageurl in ArrayList<ImageUrlModel> , to in this case ImageUrlModel.size() should be 2 .

You can redesign your ProductModel POJO to the below class:

@XmlAccessorType(XmlAccessType.FIELD)
public class ProductModel {

    @XmlElementWrapper(name="imagesurl")
    @XmlElement(name = "imageurl")
    private ArrayList<String> imageurl;

    public ArrayList<String> getImagesUrlModels() {
        return imageurl;
    }

    public void setImagesUrlModels(ArrayList<String> imagesUrlModels) {
        this.imageurl = imagesUrlModels;
    }
}

Try this:

@XmlRootElement(name = "product")
public class ProductModel {
private ArrayList<ImageUrlModel> imagesUrlModels;
public ArrayList<ImageUrlModel> getImagesUrlModels() {
        return imagesUrlModels;
    }

    @XmlElementWrapper(name = "imagesurl")
    @XmlElement(name = "imageurl")
    public void setImagesUrlModels(ArrayList<ImageUrlModel> imagesUrlModels) {
        this.imagesUrlModels = imagesUrlModels;
    }
}

public class ImageUrlModel {

    private String value;


    public String getValue() {
        return value;
    }
    @XmlValue
    public void setValue(String value) {
        this.value = value;
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM