2009-08-28 6 views
1

J'ai un problème avec la validation Java xml.java xml validation JDK 1.5 JDK 1.6 différence

Je le XSD suivant:

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

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

Le (simplifié) code de mon validateur:

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

Le programme de test a un comportement différent JDK 1.5 et JDK 1.6. Le XML est valide dans JDK 1.5 mais invalide dans JDK 1.6. Le message d'erreur est le suivant:

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. 

Quel JDK est correct? Comment changer le xml/xsd pour être valide dans les deux?

Répondre

1

Essayez de mettre attributeFormDefault = "qualifié" dans votre XSD. Cela ne devrait pas faire de différence, mais c'est un test rapide.

En outre: vous ne définissez pas DocumentBuilder comme prenant en compte l'espace de noms. Cela viendrait certainement à bout de la validation, mais cela casserait sous 1,5 et 1,6.

Et en général, la validation au moment de l'analyse est plus utile, car vous pouvez voir les numéros de ligne du contenu qui a échoué à la validation. Voici le code pour le faire (schema est créé au préalable):

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

thx. setNamespaceAware (true) a résolu mon problème. – asalamon74

0

Je dirais que ce bogue dans Java 6. Vous pouvez toujours mettre les attributs xsi dans tout élément.

Il est très similaire à ce bogue,

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

Essayez le 6u14 fixe. Il va probablement réparer le vôtre aussi.

+0

J'utilisais 1.6.0_14. Maintenant, j'ai mis à jour à 1.6.0_16 mais le résultat est le même. – asalamon74

Questions connexes