2013-08-22 131 views
0

我怎樣才能閱讀下面的XML與jaxb?閱讀與JAXB xml

 <xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882' 
    xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' 
    xmlns:rs='urn:schemas-microsoft-com:rowset' 
    xmlns:z='#RowsetSchema'> 
<s:Schema id='RowsetSchema'> 
    <s:ElementType name='row' content='eltOnly' rs:updatable='true'> 
     <s:AttributeType name='ATCCode' rs:number='1' rs:nullable='true' rs:writeunknown='true' rs:basecatalog='ATC' 
      rs:basetable='#t1' rs:basecolumn='ATCCode'> 
      <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='10'/> 
     </s:AttributeType> 
     <s:AttributeType name='DDD' rs:number='2' rs:nullable='true' rs:writeunknown='true' rs:basecatalog='ATC' rs:basetable='#t1' 
      rs:basecolumn='DDD'> 
      <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='20'/> 
     </s:AttributeType> 
     <s:AttributeType name='UnitType' rs:number='3' rs:nullable='true' rs:writeunknown='true' rs:basecatalog='ATC' 
      rs:basetable='#t1' rs:basecolumn='UnitType'> 
      <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='255'/> 
     </s:AttributeType> 
     <s:AttributeType name='AdmCode' rs:number='4' rs:nullable='true' rs:writeunknown='true' rs:basecatalog='ATC' 
      rs:basetable='#t1' rs:basecolumn='AdmCode'> 
      <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='255'/> 
     </s:AttributeType> 
     <s:AttributeType name='DDDComment' rs:number='5' rs:nullable='true' rs:writeunknown='true' rs:basecatalog='ATC' 
      rs:basetable='#t1' rs:basecolumn='DDDComment'> 
      <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='255'/> 
     </s:AttributeType> 
     <s:extends type='rs:rowbase'/> 
    </s:ElementType> 
</s:Schema> 
<rs:data> 
    <z:row ATCCode='A01AA01' DDD='1.1' UnitType='mg' AdmCode='O' DDDComment='0.5 mg Fluoride'/> 
    <z:row ATCCode='A01AA03' DDD='1.1' UnitType='mg' AdmCode='O'/> 
    <z:row ATCCode='A01AB02' DDD='60' UnitType='mg' AdmCode='O'/> 
    <z:row ATCCode='A01AB03' DDD='30' UnitType='mg' AdmCode='O'/> 
    <z:row ATCCode='A01AB04' DDD='40' UnitType='mg' AdmCode='O'/> 
    <z:row ATCCode='A01AB05' DDD='0.18' UnitType='g' AdmCode='O'/> 
    <z:row ATCCode='A01AB06' DDD='3' UnitType='mg' AdmCode='O'/> 
    <z:row ATCCode='A01AB07' DDD='80' UnitType='mg' AdmCode='O'/> 
    <z:row ATCCode='A01AB09' DDD='0.2' UnitType='g' AdmCode='O'/> 
    <z:row ATCCode='A01AB10' DDD='20' UnitType='mg' AdmCode='O'/> 
    <z:row ATCCode='A01AB23' DDD='1' UnitType='mg' AdmCode='O'/> 
    <z:row ATCCode='A02AA04' DDD='3' UnitType='g' AdmCode='O'/> 
    <z:row ATCCode='A02AB02' DDD='5' UnitType='g' AdmCode='O'/> 
</rs:data> 
</xml> 

Java模型類: -

@XmlAccessorType(XmlAccessType.FIELD) 
    @XmlRootElement(name = "xml") 
    public class Xml{ 
     @XmlElement 
     private List<Data> data; 

    } 

,然後加載它

private Xml unmarshall() throws JAXBException, IOException { 
    JAXBContext jc = JAXBContext.newInstance(Xml.class); 
    Unmarshaller unmarshaller = jc.createUnmarshaller();   
    return (Xml) unmarshaller.unmarshal(new BufferedReader(new FileReader(new File(fileName))); 
} 

但我總是得到數據字段爲空。所以我的問題是什麼纔是這種類型的XML的正確模型?

+1

任何具體問題的方案Java類? – Lion

回答

0

首先,雖然您的列表被稱爲data,但根據您的架構,其中的元素類型爲raw。因此您還需要在java中編寫raw

二,名單將是你的元素包裝。要指定您可以使用註釋XmlElementWrapper

最後,你的java類應該叫做Data而不是Xml!然後

你的類將如下所示:

import java.util.*; 
import javax.xml.bind.annotation.*; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Data{ 

    @XmlElementWrapper(name="rows") 
    @XmlElement(name="row") 
    private List<Row> rows; 

    // Getters and Setters!! 

} 

基本上註釋XmlElementWrapper告訴JAXB,這個字段是一個集合和屬性name指定XML元素,它映射到。而該集合的元素的xml標記由XmlElement註釋的name屬性指定。

對於一個完整的例子(也是我的片段的來源)檢查:http://blog.bdoughan.com/2010/09/jaxb-collection-properties.html

當然,或者,你可以嘗試生成使用XJC