Pregunta

Tengo un problema con la validación de XML de Java.

Tengo el siguiente xsd:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="TEST">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="LAST_NAME">
          <xsd:simpleType>
            <xsd:restriction base="xsd:string">
              <xsd:minLength value="1" />
              <xsd:maxLength value="30" />
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:element>
        <xsd:element name="FIRST_NAME">
          <xsd:simpleType>
            <xsd:restriction base="xsd:string">
              <xsd:minLength value="1" />
              <xsd:maxLength value="20" />
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:element>
        <xsd:element name="DOB" nillable="true" type="xsd:date" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

y XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<TEST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <LAST_NAME>Lastname</LAST_NAME>
  <FIRST_NAME>Firstname</FIRST_NAME>
  <DOB xsi:nil="true"/>
</TEST>

El (simplificado) código de mi validador:

boolean valid=true;
try {
    Source schemaSource = new StreamSource(xsdInputStream);
    DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document document = parser.parse(xmlInputStream);
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

    Schema schema = factory.newSchema(schemaSource);

    Validator validator = schema.newValidator();
    try {
        validator.validate(new DOMSource(document));
    } catch (SAXException e) {
        logger.log(Level.INFO, e.getMessage(), e);
        valid = false;
    }

} catch( Exception ex ) {
    logger.log(Level.SEVERE, ex.getMessage(), ex);
    valid=false;
}

El testprogram tiene un comportamiento diferente en JDK 1.5 y JDK 1.6. El XML es válido en el JDK 1.5, pero no válida en el JDK 1.6. El mensaje de error es el siguiente:

Element 'DOB' is a simple type, so it cannot have attributes, excepting those whose namespace name is identical to 'http://www.w3.org/2001/XMLSchema-instance' and whose [local name] is one of 'type', 'nil', 'schemaLocation' or 'noNamespaceSchemaLocation'. However, the attribute, 'xsi:nil' was found.

¿Qué JDK es correcta? Cómo cambiar el código XML / XSD sea válido en ambos?

¿Fue útil?

Solución

Trate de poner attributeFormDefault = "calificado" en su XSD. Eso no debe hacer una diferencia, pero es una prueba rápida.

También: no se establece su DocumentBuilder ser conscientes de espacio de nombres. Eso ciertamente romper la validación, pero sería romper en el punto 1.5, así como 1.6.

Y como comentario general, la validación en el momento del análisis es más útil, como se puede ver los números de línea del contenido que falló la validación. Aquí está el código para hacerlo (schema se crea previamente):

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(false);
dbf.setSchema(schema);
DocumentBuilder db = dbf.newDocumentBuilder();

Otros consejos

Yo diría que este es un error en Java 6. Siempre se puede poner xsi atributos de cualquier elemento.

Es muy similar a este error,

http://bugs.sun.com/bugdatabase/view_bug.do ? bug_id = 6790700

Trate la solución 6u14. Es muy probable que arreglar la suya también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top