2014-06-09 4 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; 
    } 
} 

и им пытаются генерировать * .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); 
} 

-им ожидая увидеть единый 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 аннотации, я бы карту квалификации пространства имен с помощью уровня пакета @XmlSchema аннотацию на package-info класса.

Если только глобальные элементы должны иметь пространство имен, то elementFormDefault равно UNQUALIFIED, если все элементы должны иметь пространство имен, то укажите QUALIFIED.

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

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

Для получения более подробной информации

я написал больше о JAXB и квалификации пространства имен на моем блоге:

Смежные вопросы