java - Jaxb xsd 生成生成 2 *.xsd

标签 java xml jaxb

我有以下两门类(class):

@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 类上的包级别 @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 和 namespace 限定的内容:

关于java - Jaxb xsd 生成生成 2 *.xsd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24116586/

相关文章:

android - ScrollView 不能很好地与 RelativeLayout 一起玩

xml - 使用恒等变换优化 XSLT

xml - 是否可以在 QtCreator 中为 Qt 小部件设置(添加)自定义属性?

java - JAXB java对象到xml,创建Pascal Case XML元素

java - Play 框架应该解压到哪个 Ubuntu 文件夹?

Java:使用类型参数访问私有(private)构造函数

java - 未登录的注销日期和时间

java - 如何使用 JAXB 将 null 值表示为空元素?

java - 使用 Spring-WS 时如何修复 Java 中转换 stax 源错误?

java - FloatingActionButton Sub 无法调用 Codename One 中的另一个表单