IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

[Xerces-J 1.4.4] Validation XML avec schéma XSD [XSD]


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut [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 : 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();
    		}
    
    	}
    
    }
    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
    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 : 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.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
    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>
    D:/test.xsd
    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>
    Citation Envoyé par console
    ''
    true
    " Jag blev dömd för fildelning och allt jag fick var en sketen t-shirt. " (tankafritt.nu)
    PAS DE REPONSE PAR MESSAGE PRIVE ! Penser au bouton Résolu en bas de la discussion...

  2. #2
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut Merci IBM !
    Finalement la version de Xerces-J de ma boîte ("xerces.jar"), qu'on m'avait annoncé être une 1.4.4 standard : est une 1.4.4 officielle... mais <<officieusement>> repackagée avec les classes JAXP en moins et des classes XML4J en plus.
    Le bilan c'est que le code suivant permet de faire de la validation XML par schéma XSD externe avec Xerces-J 1.4.4 (en mode non-JAXP).

    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
    76
    77
    78
    79
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.net.URL;
     
    import org.apache.xerces.parsers.SAXParser;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXParseException;
     
    /**
     * Xerces-J 1
     */
    public class TestSAX {
     
    	// http://xerces.apache.org/xerces-j/domcount.html
    	// http://xerces.apache.org/xerces-j/domwriter.html
     
    	public static void main(String[] args) {
     
    		// http://forum.java.sun.com/thread.jspa?threadID=250998
    		// http://forum.java.sun.com/thread.jspa?threadID=250998&start=20
     
    		try {
    			InputSource xml = new InputSource(new FileInputStream(
    					"D:/test2.xml"));
    			URL xsd = new File("D:/test2.xsd").toURL();
     
    			// 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);
     
    			parser.setFeature(
    					"http://apache.org/xml/features/validation/schema", true);
     
    			/*
    			 * parser.setFeature("http://xml.org/sax/features/namespaces",
    			 * false);
    			 * parser.setFeature("http://apache.org/xml/features/validation/schema-full-checking",
    			 * true);
    			 */
     
    			// http://xerces.apache.org/xerces-j/schema.html
    			parser
    					.setProperty(
    							"http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation",
    							xsd.toString());
     
    			/*
    			 * parser.setProperty("http://apache.org/xml/properties/schema/external-schemaLocation",
    			 * xsd);
    			 */
     
    			// http://xerces.apache.org/xerces-j/faq-write.html#faq-5
    			parser.setErrorHandler(new MyErrorHandler());
     
    			boolean valid = true;
     
    			try {
    				parser.parse(xml);
    			} catch (SAXParseException exception) {
    				valid = false;
    				exception.printStackTrace();
    			}
     
    			System.out.println(valid);
     
    		} catch (Throwable throwable) {
    			throwable.printStackTrace();
    		}
     
    	}
     
    }
    Si jamais ça peut être repris par quelqu'un dans les sources à partager ; je ne pense pas être le seul à avoir galéré sur ce sujet.

    " Jag blev dömd för fildelning och allt jag fick var en sketen t-shirt. " (tankafritt.nu)
    PAS DE REPONSE PAR MESSAGE PRIVE ! Penser au bouton Résolu en bas de la discussion...

  3. #3
    Membre habitué Avatar de Xavinou
    Inscrit en
    Mai 2005
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 135
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par g_rare
    Finalement la version de Xerces-J de ma boîte ("xerces.jar"), qu'on m'avait annoncé être une 1.4.4 standard : est une 1.4.4 officielle... mais <<officieusement>> repackagée avec les classes JAXP en moins et des classes XML4J en plus.
    Par curiosité, quel est l'intérêt de ce genre de chose ? Pourquoi ne pas utiliser directement la librairie IBM ?

  4. #4
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Citation Envoyé par Xavinou
    Par curiosité, quel est l'intérêt de ce genre de chose ? Pourquoi ne pas utiliser directement la librairie IBM ?
    A priori (ils ne se souviennent pas d'où vient le jar en question...) il semblerait que ce soit une archive présente "en interne" sur le WebSphere (quelle version ?!) par défaut qui soit recopiée dans leur classpath commun.
    " Jag blev dömd för fildelning och allt jag fick var en sketen t-shirt. " (tankafritt.nu)
    PAS DE REPONSE PAR MESSAGE PRIVE ! Penser au bouton Résolu en bas de la discussion...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Merci grâce a toi j'ai pu faire valider par sax avec un xsd jusque la j'avais contourner le problèe je ne validais pas ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XML] Performance & validation XML avec schéma XSD
    Par fetusgoulash dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 17/12/2012, 14h35
  2. Réponses: 1
    Dernier message: 20/04/2010, 16h41
  3. [XSD] Validation XML avec un XSD
    Par pjmorce dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 21/01/2010, 10h20
  4. Validation XML avec un XSD
    Par olobraecky dans le forum C
    Réponses: 2
    Dernier message: 16/09/2008, 13h30
  5. [XSD][xerces] validation xml avec un xsd
    Par chand_bing dans le forum Valider
    Réponses: 2
    Dernier message: 05/02/2004, 20h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo