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
MyErrorHandler.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); } } }
MyEntityResolver.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }
D:/test.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.xsd
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 <?xml encoding="UTF-8"?> <!ELEMENT soap (ruo,version,cro)> <!ELEMENT ruo (#PCDATA)> <!ELEMENT version (#PCDATA)> <!ELEMENT cro ANY>Envoyé par console
Partager