java - 파싱이란 - 자바 xml 연동




jaxb를 사용하여 xml 문서 읽기 (2)

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

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

판매 가격 콩

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

@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를 사용하여 문제가 발생하면 알려주십시오.


기본적으로 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;
    }

}





jaxb