私はXSDのひどい混乱を継承しました。終了スキーマを変更することはできませんが、必要に応じて、ファイル自体を制御することはできます。
私は2つの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>
そしてそれはうまくいくでしょう、しかし私はこのような多くの状況を持っています、そしてそれはそもそも正確に素晴らしい解決策ではありません。
誰か、何かアイデアはありますか?