2013-02-13 62 views
1

这是类似于No @XmlRootElement generated by JAXB等问题的相反方向。基本上我想运行schemagen并有两个相同类型的全局元素。如何让JAXB schemagen允许一个@XmlRootElement类使用多个元素名称

<xs:element name="root1" type="tns:sameType"/> 
<xs:element name="root2" type="tns:sameType"/> 

我明白如何用JAXBElement封送东西,但是我很遗憾如何正确地生成架构。在我看来,它看起来像下面的代码片段(@XmlRootElements是虚构的)。

@XmlRootElements(value = { 
    @XmlRootElement(name="root1", namespace="urn:example"), 
    @XmlRootElement(name="root2", namespace="urn:example") 
}) 

回答

2

您可以使用@XmlElementDecl注释与@XmlRegistry注释的类。

的ObjectFactory

当类型具有对应于它的多个全局元素的@XmlElementDecl注释被使用。该注释被放在create方法上,注释类型为@XmlRegistry。从XML模式生成模型时,该类始终被称为ObjectFactory

package forum14845035; 

import javax.xml.bind.JAXBElement; 
import javax.xml.bind.annotation.*; 
import javax.xml.namespace.QName; 

@XmlRegistry 
public class ObjectFactory { 

    @XmlElementDecl(name="root1") 
    public JAXBElement<SameType> createRoot1(SameType sameType) { 
     return new JAXBElement<SameType>(new QName("urn:example", "root1"), SameType.class, sameType); 
    } 

    @XmlElementDecl(name="root2") 
    public JAXBElement<SameType> createRoot2(SameType sameType) { 
     return new JAXBElement<SameType>(new QName("urn:example", "root2"), SameType.class, sameType); 
    } 

} 

SameType

在这种情况下使用没有注释需要在域类。

package forum14845035; 

public class SameType { 

} 

包信息

我们将利用封装级@XmlSchema批注指定为我们的模型命名空间的资格。

@XmlSchema(namespace="urn:example", elementFormDefault=XmlNsForm.QUALIFIED) 
package forum14845035; 

import javax.xml.bind.annotation.*; 

演示

package forum14845035; 

import java.io.IOException; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.SchemaOutputResolver; 
import javax.xml.transform.Result; 
import javax.xml.transform.stream.StreamResult; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(SameType.class, ObjectFactory.class); 
     jc.generateSchema(new SchemaOutputResolver() { 

      @Override 
      public Result createOutput(String namespaceUri, 
        String suggestedFileName) throws IOException { 
       StreamResult result = new StreamResult(System.out); 
       result.setSystemId(suggestedFileName); 
       return result; 
      } 

     }); 
    } 

} 

输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="urn:example" xmlns:tns="urn:example" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="root1" type="tns:sameType"/> 

    <xs:element name="root2" type="tns:sameType"/> 

    <xs:complexType name="sameType"> 
    <xs:sequence/> 
    </xs:complexType> 

</xs:schema> 

更多信息

+1

完美,谢谢。我一直在使用jaxb.in​​dex,甚至没有考虑将ObjectFactory视为可能的途径。 – Chase 2013-02-13 01:52:37

相关问题