2013-08-22 2 views
0

Как я могу прочитать приведенный ниже xml с jaxb?Прочтите xml с помощью JAXB

 <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

Любой конкретный вопрос? – Lion

ответ

0

Ну, во-первых, хотя ваш список называется data, согласно вашей схеме, элементы внутри него имеют тип raw. Поэтому вам также нужно моделировать raw в java.

Во-вторых, список будет вашим элементом оберткой. Чтобы указать, что вы можете использовать аннотацию 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 элементов этой коллекции указан атрибутом name аннотации XmlElement.

Для полного примера (также источник моего сниппета) проверить: http://blog.bdoughan.com/2010/09/jaxb-collection-properties.html

Конечно, в качестве альтернативы, вы можете попробовать сгенерировать Java-классы из схемы с использованием XJC

Смежные вопросы