从jaxb类生成内存模式

时间:2012-12-06 17:42:11

标签: java validation jaxb

我继承了一堆可怕的XSD。我无法更改结束模式,但如果需要,我可以自己控制文件。

我有两个XSD文件(好吧,还有更多,但它是一个例子)(另外,我意识到我拼错了地址。客户现在正在使用它。我的坏)

Schema1:

<xsd:schema xmlns="http://Schema1" targetNamespace="http://Schema1" xmlns:s2="http://Schema2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xsd:import namespace="http://Schema2" schemaLocation="Schema2.xsd.xsd"/>
    <xsd:element name="Adderess">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="s2:StreetAddress" minOccurs="0"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

架构2:

<xsd:schema xmlns="http://Schema2" targetNamespace="http://Schema2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xsd:element name="StreetAddress" type="xsd:string" />
</xsd:schema>

使用JAXB RI,我在我的java类中得到了这个:

public static class Adderess
        implements Serializable
    {

        @XmlElement(name = "StreetAddress", namespace = "http://Schema2")
        protected String streetAddress;
 }

在运行时,为了验证发送的XML客户端,我使用:

final List<ByteArrayOutputStream> outs = new ArrayList<ByteArrayOutputStream>();

    try
    {
        jc.generateSchema(new SchemaOutputResolver(){
            @Override public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException
            {
                // Stream the schema for this specified namespace

                ByteArrayOutputStream out = new ByteArrayOutputStream();
                outs.add(out);
                StreamResult streamResult = new StreamResult(out);
                streamResult.setSystemId("");
                return streamResult;                }

        });
    }

BUT ..... 产生这个:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" targetNamespace="http://Schema1" xmlns:ns1="http://Schema2" xmlns:tns="http://Schema1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:import namespace="http://Schema2"/>
    <xs:element name="InputData" form="qualified">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="StreetAddress" type="xs:string" form="qualified" minOccurs="0"/>
            <xs:sequence>
        <xs:complexType>
    <xs:element>
</xs:schema>

关键是,当我从另一个命名空间中引用复杂类型时,它在内存模式gen中工作正常。当我引用一个原始类型的元素(比如,在这种情况下,是一个String)时,内存生成的模式似乎没有得到它在另一个名称空间中,所以我的XML验证失败。

我可以做一些蹩脚的事情,比如将它放在Schema2中:

<xsd:element name="StreetAddress">
    <xsd:complexType>
        <xsd:simpleContent>
            <xsd:extension base="xsd:string"></xsd:extension>
        </xsd:simpleContent>    
    </xsd:complexType>
</xsd:element>

这样可行,但我有很多这样的情况,这不是一个很好的解决方案。

请,任何人,任何想法?

0 个答案:

没有答案