2011-10-19 12 views
5

tengo un esquema XML que contiene una serie deValidación XML en Java: processContents = "laxa" parece no funcionar correctamente

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

definiciones, es decir, que permite insertar etiquetas arbitrarias de otros espacios de nombres. processContents="lax" indica que el analizador debe intentar validar estas etiquetas, si tiene el esquema correspondiente (1)(2).

Para mí, esto significa que si le doy al analizador todos los documentos de esquema y hay una etiqueta XML no válida de uno de los espacios de nombres secundarios, debe informar un error.

Sin embargo, parece que el validador Java XML ignora dichos errores. He verificado que el analizador tiene todos los documentos de esquema necesarios para realizar la validación (si cambio el esquema XML a processContents="strict", funciona como se espera y utiliza los documentos del esquema secundario para la validación). Parece que para el validador se comporta como si el atributo se especificara con el valor skip.

código Java para la validación:

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

ejemplo Mínimo:

El esquema principal:

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

El esquema secundaria:

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

El documento XML que estoy tratando de validar:

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

Utilizando el código de Java anterior dando los dos documentos de esquema no produce algún error de validación, solamente si cambio el lax a strict en la base esquema (que no quiero) El mensaje de error en este caso es

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

Preguntas:

¿He mal algo y es esto en realidad el comportamiento correcto? ¿O tengo razón con respecto al processContents?

¿Mis documentos de esquema están haciendo lo correcto?

¿Mi código de Java es correcto? ¿Cómo podría cambiarlo para que se comporte como se esperaba?

Respuesta

6

De acuerdo con la especificación:

"validará elementos y atributos para los cuales se puede obtener información de esquema, pero no va a señalar los errores de aquellos a los que no se puede obtener ninguna información de esquema."

Por lo tanto, cuando utiliza procesContents "lax", el validador no puede encontrar un esquema para el "invalidTag" y por lo tanto lo ignora, según la especificación.

+1

Pero, ¿no debería validar el espacio de nombres 'secondary', para el cual * tiene * un esquema, y ​​ver que' invalidTag' no es válido en este espacio de nombres? –

+3

No, no se basa en si hay definiciones de esquema para el espacio de nombres, solo si hay una declaración de elemento para el nombre del elemento específico. –

+0

Muchas gracias por corregir mi malentendido. –

Cuestiones relacionadas