簡體   English   中英

Jaxb xsd生成產生2 * .xsd

[英]Jaxb xsd generation producing 2 *.xsd's

我有以下2類:

@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);
}

我希望看到一個針對“ namespaceX”的xsd。 相反,我得到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>

我在做什么錯?

不用在每個@XmlRootElement注釋上指定名稱空間,而是使用package-info類上的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和名稱空間限定的更多信息:

暫無
暫無

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

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