2013-10-15 3 views
3

jaxb를 사용하여 xml을 읽으려고하고 파서를 만들었습니다. 나는 내 Java Bean과 주석을 구조화하는 방법에 대해 약간의 의구심을 갖고있다. 불법적 인 주석 오류가 발생했기 때문에 내가 한 일이 잘못되었다는 것을 알고 있습니다.jaxb를 사용하여 xml 문서 읽기

jax b가 내 xml을 구문 분석 할 수 있도록 bean 및 주석을 작성하는 방법에 대한 도움을 얻을 수 있습니까?

내 단순화 된 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> 

내가 내 자바 콩을 쓴 방법입니다. ..

@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... 
} 
매핑으로3210

판매 가격 콩

@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

관련 문제