2010-11-22 23 views
2

シンプルなclassesの正しいスキーマ(構造とデータ型を検証するため)を見つけるのは苦労しています。たとえば、Employeeクラスの回答をschemagen(JDKに付属)で得ることができましたが、それでもHumanResourcesで動作するようにはできませんでした。Marshallerの適切なXMLスキーマsetSchema

私はEmployeeクラスインスタンスのコレクションをXMLにシリアル化しようとしています。そのために、クラスのクラス要素のリストを含むクラスHumanResourcesを作成しました。例:以下は

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スキーマを取得します。詳細については

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); 

は、以下を参照してください。

関連する問題