我继承了一堆可怕的 XSD。我无法更改最终架构,但如有必要,我可以自己控制文件。
我有两个 XSD 文件(好吧,还有很多,但这是一个例子)(另外,我意识到我拼错了地址。客户现在正在使用它。我的错)
架构1:
<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; }
});
}
但是.....产生这个:
<?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>
关键是,当我从另一个命名空间引用复杂类型时,它在内存模式生成中运行良好。当我引用一个原始类型的元素(例如,在本例中为字符串)时,内存中生成的模式似乎没有得到它在另一个命名空间中,因此我的 XML 验证失败。
我可以做一些杂乱无章的事情,比如把它放在 Schema2 中:
<xsd:element name="StreetAddress">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string"></xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
这会奏效,但我有很多这样的情况,这并不是一个很好的解决方案。
拜托,任何人,有什么想法吗?