代码之家  ›  专栏  ›  技术社区  ›  Margus

适合Marshaller setSchema的XML模式

  •  2
  • Margus  · 技术社区  · 14 年前

    我很难找出简单的 classes . 例如,我可以得到答案 Employee schemagen (随JDK提供),但仍无法使其工作 HumanResources .

    我正在尝试序列化 雇员 类实例到XML。为此,我创建了类 企业人力资源管理师 ,其中包含 雇员 类元素。例子:

        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);
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   bdoughan    14 年前

    下面是如何使用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);
    

    有关详细信息,请参见: