[英]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模式時,這將適用。
從其中一種XML模式(即具有目標名稱空間ns
的XML模式)生成模型。
對於直接與用於生成Java模型的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.