私はつまり、それは他の名前空間の任意のタグを挿入することができますXML検証:のprocessContents =「緩い」は正しく
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
定義の数を、含まれているXMLスキーマを持って動作しないようです。 processContents="lax"
は、対応するスキーマが(1)(2)の場合、パーザがこれらのタグの検証を試行する必要があることを示します。
これは、パーサーにすべてのスキーマ文書を渡し、セカンダリ名前空間の1つに無効なXMLタグがある場合、エラーを報告する必要があることを意味します。
しかし、Java XMLバリデーターはこのようなエラーを無視しているようです。私はパーサーが検証を実行するのに必要なすべてのスキーマ文書を持っていることを確認しました(XMLスキーマをprocessContents="strict"
に変更すると、期待どおりに機能し、検証のためにセカンダリスキーマ文書が使用されます)。バリデーターは、属性が値skip
で指定されているかのように振る舞います。
検証のためのJavaコード:
/*
* xmlDokument is the file name of the XML document
* xsdSchema is an array with all schema documents
*/
public static void validate(String xmlDokument, Source[] xsdSchema) throws SAXException, IOException {
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(xsdSchema);
Validator validator = schema.newValidator();
validator.setErrorHandler(new MyErrorHandler());
validator.validate(new StreamSource(new File(xmlDokument)));
}
最小例:
主要なスキーマ:
<xs:schema
xmlns="baseNamespace"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="baseNamespace"
xmlns:tns="baseNamespace">
<!-- Define single tag "baseTag" -->
<xs:element name="baseTag">
<xs:complexType>
<xs:sequence>
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
二スキーマ:
<xs:schema
xmlns="secondaryNamespace"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="secondaryNamespace"
xmlns:tns="secondaryNamespace"
elementFormDefault="qualified"
attributeFormDefault="qualified">
<xs:element name="additionalTag"/>
</xs:schema>
私が検証しようとしているXMLドキュメント:両方のスキーマ文書を与える上記のJavaコードを使用して
<baseTag
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="baseNamespace"
xmlns:secondary="secondaryNamespace"
xsi:schemaLocation="
baseNamespace base.xsd
secondaryNamespace secondary.xsd">
<secondary:additionalTag/>
<secondary:invalidTag/>
</baseTag>
は私がベースにstrict
にlax
を変更する場合にのみ、検証エラーを生成しません。スキーマ(私は望みません)。この場合、エラーメッセージが
cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'secondary:invalidTag'.
質問です:
私が何かを誤解し、これは実際には正しい動作ですでしたか?またはprocessContents
に関して私は正しいですか?
私のスキーマ文書は正しいことですか?
Javaコードは正しいですか?期待どおりに動作するように、どうすれば変更できますか?仕様によると
しかし、それが*スキーマを持っている 'secondary'という名前空間を検証し、' invalidTag'がこの名前空間で有効でないことを確認してはいけませんか? –
いいえ、特定の要素名の要素宣言があるかどうかだけで、名前空間のスキーマ定義があるかどうかには基づいていません。 –
私の誤解を訂正していただきありがとうございます。 –