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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laut spec:
"Es wird überprüft, - Elemente und-Attribute, für die es erhalten kann schema-Informationen, aber es wird nicht signal Fehler für diejenigen, die es nicht erhalten keine Schemainformationen."
So, wenn Sie procesContents "lax", der validator nicht finden können, ein schema für die "invalidTag" und daher ignoriert es, wie in den spec.
secondary
, für die Sie hat, ein schema, und sehen, dassinvalidTag
ist nicht gültig in diesem namespace?