【问题标题】:How to get JAXB schemagen to allow multiple element names for one @XmlRootElement class如何让 JAXB schemagen 允许一个 @XmlRootElement 类的多个元素名称
【发布时间】:2013-02-13 01:33:34
【问题描述】:

这与No @XmlRootElement generated by JAXB 等问题的方向相反。基本上我想运行 schemagen 并拥有两个相同类型的全局元素。

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

我了解如何使用 JAXBElement 编组事物,但我不知道如何正确生成架构。在我看来,它看起来类似于以下 sn-p(@XmlRootElements 是虚构的)。

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

【问题讨论】:

    标签: java jaxb jaxb2


    【解决方案1】:

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

    对象工厂

    @XmlElementDecl 注解在一个类型有多个与之对应的全局元素时使用。注释放置在使用@XmlRegistry 注释的类的create 方法上。从 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);
        }
    
    }
    

    同类型

    在这个用例中,域类不需要注释。

    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>
    

    更多信息

    【讨论】:

    • 完美,谢谢。我一直在使用 jaxb.in​​dex,甚至没有想过将 ObjectFactory 视为一种可能的途径。
    猜你喜欢
    • 1970-01-01
    • 2022-09-25
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    相关资源
    最近更新 更多