2013-07-08 3 views
3

Je suis confronté à un problème étrange lors de la validation d'un XML avec un XSD très basique. Le JDK 1.6 et 1.7 JDK de comportement ne sont pas les mêmes ...Échec de validation dans JDK 1.6, succès dans JDK 1.7

Voici mon schéma:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Salaries" type="SalariesType"> 
    <xs:unique name="Salary-Ctrl"> 
     <xs:selector xpath="Salary" /> 
     <xs:field xpath="@institutionIDRef" /> 
     <xs:field xpath="Code" /> 
    </xs:unique> 
    </xs:element> 
    <xs:complexType name="SalariesType"> 
    <xs:sequence> 
     <xs:element name="Salary" type="SalaryType" maxOccurs="unbounded" /> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="SalaryType"> 
    <xs:sequence> 
     <xs:element name="ValidAsOf" type="xs:date" minOccurs="0" /> 
     <xs:element name="Code" type="xs:string" minOccurs="0" /> 
     <xs:element name="AnnualBasis" type="xs:string" /> 
    </xs:sequence> 
    <xs:attribute name="institutionIDRef" type="xs:string" use="required" /> 
    </xs:complexType> 
</xs:schema> 

Et voici mon XML:

<Salaries> 
    <Salary institutionIDRef="someID"> 
    <AnnualBasis>someContent</AnnualBasis> 
    </Salary> 
</Salaries> 

Pour la validation, j'utilise cette simple morceau de programme:

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = factory.newSchema(new SAXSource(new InputSource(new ByteArrayInputStream(xsd.getBytes())))); 
Validator validator = schema.newValidator(); 

validator.validate(new SAXSource(new InputSource(new ByteArrayInputStream(xml.getBytes())))); 
System.out.println("Validated !"); 

Si je lance simplement ce morceau de code avec le JDK 1.7, il n'y a pas d'erreur et le X ML est validé (et donc avec le JDK 1.5). Toutefois, dans le JDK 1.6 Je l'exception suivante:

Exception in thread "main" org.xml.sax.SAXParseException: Not enough values specified for <unique> identity constraint specified for element "Salaries". 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131) 
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384) 
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318) 
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:423) 
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3188) 
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$ValueStoreBase.endValueScope(XMLSchemaValidator.java:3463) 
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.endValueScopeFor(XMLSchemaValidator.java:1479) 
    at com.sun.org.apache.xerces.internal.impl.xs.identity.Selector$Matcher.endElement(Selector.java:235) 
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleEndElement(XMLSchemaValidator.java:2169) 
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.endElement(XMLSchemaValidator.java:824) 
    at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.endElement(ValidatorHandlerImpl.java:565) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:601) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2939) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 
    at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorHandlerImpl.validate(ValidatorHandlerImpl.java:700) 
    at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:97) 
    at javax.xml.validation.Validator.validate(Validator.java:127) 
    at ch.Test.main(Test.java:53) 

Comment puis-je faire le validateur accepter cela dans JDK 1.6?

Merci & Cordialement

Répondre

2

ressemble à un bug dans le processeur de schéma. Solution: utilisez un processeur de schéma plus fiable et indépendant de la version JDK, comme Apache Xerces ou Saxon-EE.

Les bogues dans le logiciel XML dans le JDK semblent ne jamais être résolus, et vous pouvez attendre des années avant de recevoir un rapport de bogue. Et je suspecte fortement que le JDK soit libéré sans exécuter tous les tests de conformité XML du W3C. L'utilisation de bibliothèques tierces est généralement beaucoup plus fiable.

+0

Bonjour et merci pour la réponse. Malheureusement je suis incapable de le faire facilement parce que la validation est faite en souterrain en invoquant un webservice (en fait le marshalling échoue). Je suppose que la solution facile serait de passer à JDK 1.7 et d'utiliser l'option -source 1.6 dans mon environnement JavaEE6 ... – ctabin

Questions connexes