为类似的模式重用JAXB类

时间:2014-04-15 08:10:25

标签: java xml jaxb

我有两个类似的模式,对于某些元素,它们具有相同的结构,但是在不同的名称空间下定义。在为第二个模式生成类时,有没有办法为第一个模式重用JAXB生成的类?我知道jaxb允许绑定自定义,但是我无法确定同一组类是否可以与两个名称空间一起使用同时。更具体地说:

Schema1

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns="ns1" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="ns1">
    <xs:element name="Document" type="Document"/>
    <xs:complexType name="Document">
        <xs:sequence>
            <xs:element name="Root1" type="Root1Type"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Root1Type">
        <xs:sequence>
            <xs:element name="Child" type="ChildType"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="ChildType">
        <xs:sequence>
            <xs:element maxOccurs="1" minOccurs="0" name="MndtId" type="Max35Text"/>
            <xs:element name="MndtReqId" type="Max35Text"/>
        </xs:sequence>
    </xs:complexType>
    <xs:simpleType name="Max35Text">
        <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
            <xs:maxLength value="35"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

SCHEMA2

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns="ns2" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="ns2">
    <xs:element name="Document" type="Document"/>
    <xs:complexType name="Document">
        <xs:sequence>
            <xs:element name="Root2" type="Root2Type"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Root2Type">
        <xs:sequence>
            <xs:element name="Child" type="ChildType"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="ChildType">
        <xs:sequence>
            <xs:element maxOccurs="1" minOccurs="0" name="MndtId" type="Max35Text"/>
            <xs:element name="MndtReqId" type="Max35Text"/>
        </xs:sequence>
    </xs:complexType>
    <xs:simpleType name="Max35Text">
        <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
            <xs:maxLength value="35"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

xjc将为第一个模式生成:

ns1/ChildType.java
ns1/Document.java
ns1/ObjectFactory.java
ns1/Root1Type.java
ns1/package-info.java

和第二个:

ns2/ChildType.java
ns2/Document.java
ns2/ObjectFactory.java
ns2/Root2Type.java
ns2/package-info.java

我想知道的是,在为第二个模式生成类时,是否可以重用为第一个模式生成的ChildType。

由于

1 个答案:

答案 0 :(得分:0)

当您有多个只有目标名称空间不同的XML模式时,这将有效。

生成Java模型

从其中一个XML架构(即具有目标命名空间ns的架构)生成模型。

从主XML模式处理XML

对于任何直接对应于您用于生成Java模型的XML模式的XML,您可以对其进行编组/解组

从辅助XML模式处理XML

解组

当您处理与具有命名空间XMLFilter的架构相对应的XML文档时,可以在解组时应用SAX ns2,就好像它对应于具有命名空间{{1的架构的模式}}

ns1

演示代码

以下是一些示例代码,演示了如何应用import org.xml.sax.*; import org.xml.sax.helpers.XMLFilterImpl; public class NamespaceFilter extends XMLFilterImpl { private static final String NAMESPACE = "ns1"; @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(NAMESPACE, localName, qName); } @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { super.startElement(NAMESPACE, localName, qName, atts); } }

XMLFilter

编组

TBD