2013-02-13 96 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

相關問題