I am trying to read in xml using jaxb and have had a shot at creating a parser. I'm having some doubts about the way I have structured my java beans and the annotations in them. I know what I have done is wrong because I'm getting illegal annotation errors.
Could I please get some help on how to write the beans and annotations to allow jax b to do it's thing and parse my xml.
thanks (sorry for the long post but hopefully it will help others)
My simplified xml document looks like this...
<WEB-ITM-EXT-REC>
<ACTVTY-CODE>A</ACTVTY-CODE>
<WEB-ITM-EXT-DATA>
<ITEM-NO>93501250080</ITEM-NO>
<PROMOTION-DETAILS>
<PROMOTION-ID></PROMOTION-ID>
<PROMOTION-START-DATE>0</PROMOTION-START-DATE>
<PROMOTION-END-DATE>0</PROMOTION-END-DATE>
<PROMOTION-PRICE>.00</PROMOTION-PRICE>
</PROMOTION-DETAILS>
<NORMAL-SELL-PRICES>
<SELL-PRICE-EFFECTIVE-DATE-1>0</SELL-PRICE-EFFECTIVE-DATE-1>
<SELL-PRICE-1>.00</SELL-PRICE-1>
<SELL-PRICE-EFFECTIVE-DATE-2>0</SELL-PRICE-EFFECTIVE-DATE-2>
<SELL-PRICE-2>.00</SELL-PRICE-2>
<SELL-PRICE-EFFECTIVE-DATE-3>0</SELL-PRICE-EFFECTIVE-DATE-3>
<SELL-PRICE-3>189.95</SELL-PRICE-3>
</NORMAL-SELL-PRICES>
<OUT-OF-STOCK-IND>Y</OUT-OF-STOCK-IND>
</WEB-ITM-EXT-DATA>
</WEB-ITM-EXT-REC>
Here is the way I have written my java beans...
@XmlRootElement(name = "WEB-ITM-EXT-REC")
public class ItemDocuments {
@XmlElement(name="ACTVTY-CODE")
private String activityCode;
@XmlElement(name="WEB-ITM-EXT-DATA")
private List<ItemDocument> itemDocuments;
public List<ItemDocument> getItemDocuments() {
return itemDocuments;
}
public void setItemDocuments(List<ItemDocument> itemDocuments) {
this.itemDocuments = itemDocuments;
}
public String getActivityCode() {
return activityCode;
}
public void setActivityCode(String activityCode) {
this.activityCode = activityCode;
}
}
Item bean
@XmlRootElement(name = "WEB-ITM-EXT-DATA")
@XmlAccessorType(XmlAccessType.FIELD)
public class ItemDocument {
@XmlElement(name="ITEM-NO")
private String itemNo;
private PromotionDocument promotion;
private SellPriceDocument sellPrice;
@XmlElement(name="OUT-OF-STOCK-IND")
private String outOfStockInd;
getters..
setters...
}
Sell Price Bean
@XmlType
public class SellPriceDocument {
@XmlElement(name="SELL-PRICE-EFFECTIVE-DATE-1")
private String sellPriceEffectiveDateOne;
@XmlElement(name="SELL-PRICE-1")
private String sellPriceOne;
@XmlElement(name="SELL-PRICE-EFFECTIVE-DATE-2")
private String sellPriceEffectiveDateTwo;
@XmlElement(name="SELL-PRICE-2")
private String sellPriceTwo;
@XmlElement(name="SELL-PRICE-EFFECTIVE-DATE-3")
private String sellPriceEffectiveDateThree;
@XmlElement(name="SELL-PRICE-3")
private String sellPriceThree;
getters..
setters...
}
Promotion Bean
public class PromotionDocument {
@XmlElement(name="PROMOTION-ID")
private String promotionId;
@XmlElement(name="PROMOTION-START-DATE")
private String promotionStartDate;
@XmlElement(name="PROMOTION-END-DATE")
private String promotionEndDate;
@XmlElement(name="PROMOTION-PRICE")
private String promotionPrice;
getters..
setters...
}
By default a JAXB implementation will treat public properties as mapped. This means by default you should annotate the properties:
@XmlRootElement(name = "WEB-ITM-EXT-REC")
public class ItemDocuments {
private List<ItemDocument> itemDocuments;
@XmlElement(name="WEB-ITM-EXT-DATA")
public List<ItemDocument> getItemDocuments() {
return itemDocuments;
}
public void setItemDocuments(List<ItemDocument> itemDocuments) {
this.itemDocuments = itemDocuments;
}
}
When you annotate the field you should specify @XmlAccessorType(XmlAccessTypr.FIELD) on the class.
@XmlRootElement(name = "WEB-ITM-EXT-REC")
@XmlAccessorType(XmlAccessType.FIELD)
public class ItemDocuments {
@XmlElement(name="WEB-ITM-EXT-DATA")
private List<ItemDocument> itemDocuments;
public List<ItemDocument> getItemDocuments() {
return itemDocuments;
}
public void setItemDocuments(List<ItemDocument> itemDocuments) {
this.itemDocuments = itemDocuments;
}
}
You have annotated two classes (ItemDocuments and ItemDocument) with @XmlRootElement . You should only have one @XmlRootElement (acccording to standards http://www.w3.org/TR/REC-xml/) because this defines a document. And looking at the xml you want to produce. I suggest following
@XmlRootElement(name = "WEB-ITM-EXT-REC")
@XmlAccessorType(XmlAccessType.FIELD)
public class ItemDocuments {
@XmlElement(name = "WEB-ITM-EXT-DATA")
public List<ItemDocument> itemDocumentList = new ArrayList<ItemDocument>();
public List<ItemDocument> getItemDocumentList() {
return itemDocumentList;
}
public void setItemDocumentList(List<ItemDocument> itemDocumentList) {
this.itemDocumentList = itemDocumentList;
}
}
ss
@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
public class ItemDocument {
@XmlElement(name = "ITEM-NO")
private String itemNo;
public String getItemNo() {
return itemNo;
}
public void setItemNo(String itemNo) {
this.itemNo = itemNo;
}
}
This will produce xml like
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<WEB-ITM-EXT-REC>
<WEB-ITM-EXT-DATA>
<ITEM-NO>1111</ITEM-NO>
</WEB-ITM-EXT-DATA>
<WEB-ITM-EXT-DATA>
<ITEM-NO>2222</ITEM-NO>
</WEB-ITM-EXT-DATA>
</WEB-ITM-EXT-REC>
So xsd will look like
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="WEB-ITM-EXT-REC" type="itemDocuments"/>
<xs:complexType name="itemDocuments">
<xs:sequence>
<xs:element name="WEB-ITM-EXT-DATA" type="itemDocument" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="itemDocument">
<xs:sequence>
<xs:element name="ITEM-NO" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
This should give you enough to start. Let me know if you have problem using SellpriceDocument and PromotionDocument in ItemDocument.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With