2013-10-15 92 views
3

我想在xml中使用jaxb讀取,並創建了一個解析器。我對構建我的java bean和註釋的方式有些懷疑。我知道我所做的是錯誤的,因爲我收到了非法的註釋錯誤。閱讀xml文檔使用jaxb

請問如何編寫bean和annotation以便讓jax b來做它的事情並解析我的xml。

感謝(抱歉長職位,但希望這將幫助其他人)

我簡單的XML文檔看起來像這樣...

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

這是我寫我的Java bean的方式。 ..

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

項豆

@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... 
} 

售價豆

@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... 
} 

推廣豆

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... 
} 
+0

你有一個模式,在這個模式中,你的端點正在被驗證或者編組嗎?您可以使用該模式生成Java對象,而不是手工製作它們。 –

回答

1

您有@XmlRootElement註釋兩班(ItemDocuments和ItemDocument)。您應該只有一個@XmlRootElement(根據標準http://www.w3.org/TR/REC-xml/),因爲它定義了一個文檔。看看你想生產的XML。我建議以下

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

} 

這將產生XML像

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

所以XSD看起來像

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

這應該給你足夠的啓動。讓我知道如果您在ItemDocument中使用SellpriceDocument和PromotionDocument有問題。

+0

非常感謝你。這非常出色。 Jaxb像魔術一樣工作。 – Richie

+0

@Richie - 您可以使用'@ XmlRootElement'註釋多個類。 –

2

默認情況下爲映射一個JAXB實現將把公共屬性。這意味着,在默認情況下,你應該註釋的屬性:

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

} 

當你註釋字段,你應該在類指定@XmlAccessorType(XmlAccessTypr.FIELD)

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

}

+0

謝謝。這個事實很好理解。 – Richie