[Xerces-J 1.4.4] Validation XML avec schéma XSD
Bonsoir,
Je dois valider une structure XML (SOAP en fait) par schéma XSD externe (non-déclaré dans le XML mais déterminé dynamiquement lors de l'exécution) avec l'API Xerces-J 1.4.4 (et je ne peux pas upgrader en 2.8.0 !) : d'où la nécessité (expliquée ici) de positionner une DTD vide (n'ayant pas réussi avec une DTD du style "<!DOCTYPE soap SYSTEM []>") et de rediriger le tout vers une DTD minimaliste grâce à un EntityResolver fait-maison... malheureusement mon code ne permet pas (même si j'ai bien redéveloppé un ErrorHandler dans les normes) de remonter une quelconque erreur bien que le XML ne respecte pas son schéma.
Où se trouve mon erreur ?
MERCI & Bonne Lecture ;)
----------
TestSchemaValidation.java
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
import java.io.FileInputStream;
import org.apache.xerces.parsers.SAXParser;
import org.xml.sax.InputSource;
import org.xml.sax.SAXParseException;
/**
* Xerces-J 1.x
*/
public class TestSchemaValidation {
// http://xerces.apache.org/xerces-j/domcount.html
// http://xerces.apache.org/xerces-j/domwriter.html
public static void main(String[] args) {
/*
* System.out.println(System
* .getProperty("javax.xml.parsers.SAXParserFactory"));
*/
try {
InputSource xml = new InputSource(
new FileInputStream("D:/test.xml"));
String xsd = "file:/text.xsd";
// http://xerces.apache.org/xerces-j/faq-general.html#faq-1
// http://xerces.apache.org/xerces-j/faq-write.html#faq-3
// http://xerces.apache.org/xerces-j/features.html
// http://xerces.apache.org/xerces-j/properties.html
SAXParser parser = new SAXParser();
// http://xerces.apache.org/xerces-j/faq-general.html#faq-7
parser.setFeature("http://xml.org/sax/features/validation", true);
// http://xerces.apache.org/xerces-j/faq-write.html#faq-5
parser.setErrorHandler(new MyErrorHandler());
// http://xerces.apache.org/xerces-j/schema.html
parser.setProperty( "http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation",
xsd);
/*
* parser .setProperty(
* "http://apache.org/xml/properties/schema/external-schemaLocation",
* xsd);
*/
parser
.setFeature(
"http://apache.org/xml/features/validation/schema-full-checking",
true);
parser.setEntityResolver(new MyEntityResolver());
boolean valid = true;
try {
parser.parse(xml);
} catch (SAXParseException exception) {
valid = false;
exception.printStackTrace();
}
System.out.println(valid);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
} |
MyErrorHandler.java
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
/**
* Xerces-J 1.x
*/
public class MyErrorHandler implements ErrorHandler {
public void error(SAXParseException exception) throws SAXException {
System.out.println("error");
throw exception;
}
public void fatalError(SAXParseException exception) throws SAXException {
System.out.println("fataError");
throw exception;
}
public void warning(SAXParseException exception) throws SAXException {
System.out.println("warning");
throw exception;
}
} |
MyEntityResolver.java
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
import java.io.FileInputStream;
import java.io.IOException;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* Xerces-J 1.x
*/
public class MyEntityResolver implements EntityResolver {
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException {
// System.out.println(publicId);
System.out.println("'" + systemId + "'");
return new InputSource(new FileInputStream("D:/test.dtd"));
}
} |
D:/test.xml
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE soap SYSTEM "">
<soap>
<ruo>fd5s4fds54fsdf4df4dsf</ruo>
<version>51</version>
<cro>
toto<!--<tmp>helloworld</tmp>-->
</cro>
</soap>
<!-- commentaire -->
<!--
<!DOCTYPE sautdeligne SYSTEM "">
<sautdeligne>
<ligne_vide> texte avec des espaces de chaque cote </ligne_vide> <tabulation>texte sur une 1e ligne
texte sur une 2e ligne</tabulation>
<indentation>1967-08-13</indentation><balise_vide/>
<espaces_uniquement> </espaces_uniquement>
</sautdeligne>
-->
<!--
<!DOCTYPE element-racine SYSTEM "URI-de-la-dtd">
<!DOCTYPE sautdeligne SYSTEM "file:///D:/test.dtd">
--> |
D:/test.xsd
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="sautdeligne">
<xs:complexType>
<xs:sequence>
<xs:element name="ligne_vide" type="xs:string"/>
<xs:element name="tabulation" type="xs:string"/>
<xs:element name="indentation" type="xs:date"/>
<xs:element name="balise_vide"/>
<xs:element name="espaces_uniquement"/>
<xs:element name="plantage"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema> |
D:/test.xsd
Code:
1 2 3 4 5 6
|
<?xml encoding="UTF-8"?>
<!ELEMENT soap (ruo,version,cro)>
<!ELEMENT ruo (#PCDATA)>
<!ELEMENT version (#PCDATA)>
<!ELEMENT cro ANY> |
Citation:
Envoyé par console
''
true
:bug: