XSD を解析する必要がありますXSOM
が、この XSD には循環インポートが含まれています。
A.xsd
<xs:schema xmlns=”ns1” targetNamespace=”ns1”>
<xs:import namespace=”ns2” schemaLocation=”B.xsd”/>
<xs:element name=”MyElement” type=”xs:string”/>
</xs:schema>
B.xsd
<xs:schema xmlns=”ns2” targetNamespace=”ns2” xmlns:ns1=”ns1”>
<xs:import namespace=”ns1” schemaLocation=”A.xsd”/>
<xs:complexType name="MyComplex">
<xs:sequence>
<xs:element ref="ns1:MyElement" minOccurs="0"/>
<xs:sequence>
<xs:complexType>
</xs:schema>
XSOM
循環インポートにより既に定義されている要素が検出されるため、スキーマを解析できません。そこで、A で定義され、B で使用される要素を外部化することで、循環インポートを打破しようとしました。
C.xsd には、B で使用される A の要素が含まれています。これらの要素は A では使用されないことに注意してください。これらが A で定義されている理由を聞かないでください。
<xs:schema xmlns=”ns1” targetNamespace=”ns1”>
<xs:element name=”MyElement” type=”xs:string”/>
</xs:schema>
A.xsdは次のようになります
<xs:schema xmlns=”ns1” targetNamespace=”ns1”>
<xs:import namespace=”ns2” schemaLocation=”B.xsd”/>
</xs:schema>
B.xsd (A.xsd の代わりに C.xsd をインポート) は次のようになります。
<xs:schema xmlns=”ns2” targetNamespace=”ns2” xmlns:ns1=”ns1”>
<xs:import namespace=”ns1” schemaLocation=”C.xsd”/>
<xs:complexType name="MyComplex">
<xs:sequence>
<xs:element ref="ns1:MyElement" minOccurs="0"/>
<xs:sequence>
<xs:complexType>
</xs:schema>
XSOM
XSD を解析できます。しかし、今では次のコードでスキーマを作成できません:
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
sf.setResourceResolver(new MyResourceResolver());
JDK 1.7 にバンドルされている標準実装を使用します。私は例外を受け取ります:
src-resolve: Cannot resolve the name 'ns1:MyElement' to a(n) 'element declaration' component.
問題は、リソース リゾルバーが B 名前空間に対して呼び出され、意味のある A 名前空間に対して呼び出されないことです。名前空間 A は A.xsd と C.xsd で共有されているため、リソース リゾルバーは C.xsd で定義されている要素を見つけることができません。
循環インポートは有効ですか? XSOM
によって解析されてから読み込まれるように、循環インポートを中断することは可能SchemaFactory
ですか?