2011-10-19 16 views
5

私はつまり、それは他の名前空間の任意のタグを挿入することができます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> 

は私がベースにstrictlaxを変更する場合にのみ、検証エラーを生成しません。スキーマ(私は望みません)。この場合、エラーメッセージが

cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'secondary:invalidTag'. 

質問です:

私が何かを誤解し、これは実際には正しい動作ですでしたか?またはprocessContentsに関して私は正しいですか?

私のスキーマ文書は正しいことですか?

Javaコードは正しいですか?期待どおりに動作するように、どうすれば変更できますか?仕様によると

答えて

6

「それはスキーマ情報を取得できるための要素と属性を検証しますが、それは、それは任意のスキーマ情報を取得することができない人のためのエラーを通知しません。」

したがって、procesContents "lax"を使用すると、validatorは "invalidTag"のスキーマを見つけることができず、したがって、仕様に従って、invalidTagを無視します。

+1

しかし、それが*スキーマを持っている 'secondary'という名前空間を検証し、' invalidTag'がこの名前空間で有効でないことを確認してはいけませんか? –

+3

いいえ、特定の要素名の要素宣言があるかどうかだけで、名前空間のスキーマ定義があるかどうかには基づいていません。 –

+0

私の誤解を訂正していただきありがとうございます。 –

関連する問題