簡體   English   中英

重用JAXB類用於類似模式

[英]Reuse JAXB classes for similar schemas

我有兩個相似的模式,對於某些元素,它們具有相同的結構,但是在不同的命名空間下定義。 為第二個模式生成類時,是否可以重用第一個模式的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。

謝謝

當您有多個僅根據目標名稱空間而不同的XML模式時,這將適用。

生成Java模型

從其中一種XML模式(即具有目標名稱空間ns的XML模式)生成模型。

從主XML模式處理XML

對於直接與用於生成Java模型的XML模式相對應的任何XML,您都可以正常地將其編組/解組。

從輔助XML模式處理XML

解組

您可以在解組時應用SAX XMLFilter ,以便在處理與名稱空間為ns2的模式相對應的XML文檔時,看起來好像與名稱空間為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

import javax.xml.bind.*;
import javax.xml.parsers.*;
import org.xml.sax.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Create the JAXBContext
        JAXBContext jc = JAXBContext.newInstance("ns1");

        // Create the XMLFilter
        XMLFilter filter = new NamespaceFilter();

        // Set the parent XMLReader on the XMLFilter
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
        filter.setParent(xr);

        // Set UnmarshallerHandler as ContentHandler on XMLFilter
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        UnmarshallerHandler unmarshallerHandler = unmarshaller
                .getUnmarshallerHandler();
        filter.setContentHandler(unmarshallerHandler);

        // Parse the XML
        InputSource xml = new InputSource("input.xml");
        filter.parse(xml);
        Object result = unmarshallerHandler.getResult();
    }

}

編組

TBD

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM