XML Validierung in Java: processContents="lax" scheint nicht korrekt zu funktionieren

Ich habe ein XML-Schema enthält eine Reihe von

<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" />

Definitionen, d.h., es erlaubt das einfügen von beliebigen tags, die von anderen namespaces. processContents="lax" zeigt an, dass der parser versuchen sollten, tun, überprüfen Sie diese tags, wenn es die nach schema (1) (2).

Für mich bedeutet das, dass wenn ich den parser alle schema-Dokumente, und es ist ein ungültiges XML-tag von einem der sekundären namespaces, die es braucht, um einen Fehler melden.

Es scheint jedoch, dass die Java-XML-validator ignoriert solche Fehler. Ich habe verifiziert, dass der parser verfügt über alle notwendigen schema-Dokumente zur Durchführung der Validierung (wenn ich das XML-schema zu processContents="strict" es wie erwartet funktioniert, und verwendet die Sekundär-schema-Dokumente für die Validierung). Es scheint, dass der validator verhält sich, als ob das Attribut mit angegeben Wert skip.

Java-code zur Validierung:

/*
 * 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)) );
}

Minimal-Beispiel:

Den primären schema:

<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>

Den sekundären 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-Dokument, das ich versuche zu überprüfen:

<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>

Mithilfe der obigen Java-code geben beide schema-Dokumente erzeugt keine Fehler bei der Validierung, nur wenn ich die lax zu strict im Basis-schema (die ich auch nicht möchte). Die Fehlermeldung in diesem Fall ist

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

Fragen:

Habe ich etwas missverstehen und das ist eigentlich das richtige Verhalten? Oder bin ich im Recht, in Bezug auf processContents?

Sind meine schema-Dokumente, das richtige zu tun?

Ist mein Java-code korrigieren? Wie könnte ich es ändern, so dass es sich wie erwartet verhält?

Schreibe einen Kommentar