2014-06-09 70 views
1

我有以下2类:JAXB XSD代生产2 *的.xsd的

@XmlRootElement(namespace = "namespaceX") 
@XmlSeeAlso({SubClass.class}) 
public class BaseClass { 
    private String baseProp; 

    @XmlAttribute 
    public String getBaseProp() { 
     return baseProp; 
    } 

    public void setBaseProp(String baseProp) { 
     this.baseProp = baseProp; 
    } 
} 

@XmlRootElement(namespace = "namespaceX") 
public class SubClass extends BaseClass { 
    private String extraProp; 

    @XmlElement 
    public String getExtraProp() { 
     return extraProp; 
    } 

    public void setExtraProp(String extraProp) { 
     this.extraProp = extraProp; 
    } 
} 

和IM试图生成*的.xsd了出来:

JAXBContext context = JAXBContext.newInstance(BaseClass.class); 
final List<DOMResult> results = new ArrayList<DOMResult>(); 
context.generateSchema(new SchemaOutputResolver() { 
    @Override public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException { 
     // save the schema to the list 
     DOMResult result = new DOMResult(); 
     result.setSystemId(suggestedFileName); 
     results.add(result); 
     return result; 
    } 
}); 

for (DOMResult domResult : results) { 
    Document doc = (Document) domResult.getNode(); 
    OutputFormat format = new OutputFormat(doc); 
    format.setIndenting(true); 
    StringWriter writer = new StringWriter(); 
    XMLSerializer serializer = new XMLSerializer(writer, format); 
    serializer.serialize(doc); 

    String xsd = writer.toString(); 

    System.err.println("xsd "+domResult.getSystemId()+":"); 
    System.err.println(xsd); 
} 

IM期待看到一个单个xsd定位“namespaceX”。相反,即时获取2:

xsd schema1.xsd: 
<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="namespaceX" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:import schemaLocation="schema2.xsd"/> 
    <xs:element name="baseClass" type="baseClass"/> 
    <xs:element name="subClass" type="subClass"/> 
</xs:schema> 

xsd schema2.xsd: 
<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="baseClass"> 
     <xs:sequence/> 
     <xs:attribute name="baseProp" type="xs:string"/> 
    </xs:complexType> 
    <xs:complexType name="subClass"> 
     <xs:complexContent> 
      <xs:extension base="baseClass"> 
       <xs:sequence> 
        <xs:element minOccurs="0" name="extraProp" type="xs:string"/> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

即时我做错了什么?

回答

1

而不是在每个@XmlRootElement注释上指定命名空间,我会使用package-info类中的程序包级别@XmlSchema注释来映射名称空间限定。

如果只有全局元素应该是名称空间限定的,那么elementFormDefaultUNQUALIFIED,如果所有元素都应该是名称空间限定的,则指定QUALIFIED

@XmlSchema(
    namespace = "namespaceX", 
    elementFormDefault = XmlNsForm.UNQUALIFIED) 
package your_package; 

import javax.xml.bind.annotation.XmlNsForm; 
import javax.xml.bind.annotation.XmlSchema; 

更多信息

我已经写了更多关于JAXB和命名空间限定在我的博客: