2010-11-22 54 views
2

我很難找出簡單的classes的正確模式(以驗證結構和數據類型)。例如,我可以用schemagen(由JDK提供)獲得Employee類的答案,但仍然無法使其爲HumanResources工作。適用於Marshaller的XML模式setSchema

我在嘗試將Employee類實例的集合序列化爲XML。爲此,我創建了類HumanResources,其中包含Employee類元素的列表。例如:

ArrayList<Employee> ems = getTestData(); 
    HumanResources hm = new HumanResources(ems); 
    SchemaFactory sf = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    JAXBContext jaxbContext = JAXBContext.newInstance(HumanResources.class); 

    Marshaller marshaller = jaxbContext.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    marshaller.setSchema(sf.newSchema(new File("src\\server\\HumanResources.xsd"))); 
    marshaller.marshal(new JAXBElement<HumanResources>(
      new QName(null, "HumanResources"), HumanResources.class, hm), os); 

回答

2

下面是如何創建使用的JAXBContext XML架構的例子:

首先,必須創建一個擴展javax.xml.bind.SchemaOutputResolver類。

public class MySchemaOutputResolver extends SchemaOutputResolver { 

    public Result createOutput(String namespaceURI, String suggestedFileName) throws IOException { 
     File file = new File(suggestedFileName); 
     StreamResult result = new StreamResult(file); 
     result.setSystemId(file.toURI().toURL().toString()); 
     return result; 
    } 

} 

然後用JAXBContext的這個類的一個實例來捕獲生成的XML Schema。

Class[] classes = new Class[4]; 
classes[0] = org.example.customer_example.AddressType.class; 
classes[1] = org.example.customer_example.ContactInfo.class; 
classes[2] = org.example.customer_example.CustomerType.class; 
classes[3] = org.example.customer_example.PhoneNumber.class; 
JAXBContext jaxbContext = JAXBContext.newInstance(classes); 

SchemaOutputResolver sor = new MySchemaOutputResolver(); 
jaxbContext.generateSchema(sor); 

欲瞭解更多信息,請參閱: