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] implémentation de XMLCatalogResolver


Sujet :

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

  1. #1
    Membre éclairé Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Par défaut [Xerces] implémentation de XMLCatalogResolver
    Salut tout le monde!

    Ca fait plusieurs jours que je me prend la tête avec le problème suivant:

    Je veux parser et valider un fichier XML par rapport à un schéma XML. Le schéma associé doit être trouver via un catalogue. Malgré tout ce que j'ai lu, je n'arrive pas à faire fonctionner tout le bazard

    J'utilise xerces 2j comme parseur Java et je voudrais utiliser XMLCatalogResolver pour trouver les références locals de mes schémas. D'après ce que j'ai lu, cette classe travaille avec le 'target namespace'. Alors voilà ce que j'ai fait:

    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
     
    // Set the DocumentBuilderFactory system property
    System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
     
    // Create the dom factory
    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
     
    // Set the namespace property
    domFactory.setNamespaceAware(true);
     
    // Set the validation property
    domFactory.setValidating(true);
    domFactory.setIgnoringComments(true);
    domFactory.setIgnoringElementContentWhitespace(true);
     
     
    // Set the schema language property to be used for validation
    domFactory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", XMLConstants.W3C_XML_SCHEMA_NS_URI);	
     
    domFactory.setFeature("http://xml.org/sax/features/validation", true);
    domFactory.setFeature("http://apache.org/xml/features/validation/schema", true);
    domFactory.setFeature("http://apache.org/xml/features/validation/schema/element-default",true);
     
    // Create the document builder
    DocumentBuilder builder = domFactory.newDocumentBuilder();
     
    XMLCatalogResolver catalog1 = new XMLCatalogResolver();
    String[] catList = new String[1];
    catList[0] = "schemas\\Catalog.xml";
    catalog1.setCatalogList(catList);
    System.out.println(catalog1.resolveURI("http://lucent.com/GRIPP/jmsProperties"));
     
    builder.setEntityResolver(catalog1);
     
    // Create and register an error handler with the parser
    JMSErrorHandler parserErrorHandler = new JMSErrorHandler();
    builder.setErrorHandler(parserErrorHandler);
     
    // Parse the xml file
    Document doc = null;
    if (xml instanceof File) {
       doc = builder.parse((File)xml);
    } else if (xml instanceof String) {
        doc = builder.parse(new InputSource(new StringReader((String)xml)));
    } 
     
    if ( parserErrorHandler.validationError == true ) {
    	// errors occured during the parsing
    	if (myLogger.isInfoEnabled()) {
    		myLogger.info(funcName + "XML file is not valid - Got parser exception");
    		myLogger.info(parserErrorHandler.saxParseException.getMessage());
    	}
    	System.exit(1);
    }  else {
    	if (myLogger.isInfoEnabled()) {
    		myLogger.info(funcName + "XML file is valid");
    	}
    }
    J'obtiens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    XML file is not valid - Got parser exception 
    schema_reference.4: Failed to read schema document 'JMS_properties.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
    Mon fichier XML:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <JMSProperties xmlns="http://GRIPP/jmsProperties"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://GRIPP/jmsProperties JMS_properties.xsd">
    ....
    </JMSProperties>
    Mon schéma XML;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <xs:schema xmlns="http://GRIPP/jmsProperties"  xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"  version="1.0" attributeFormDefault="unqualified"
        targetNamespace="http://GRIPP/jmsProperties"    >
    .....
    </xs:schema>
    Mon catalog:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?xml version="1.0" encoding="UTF-8"?>
    <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
        <uri name="http://GRIPP/jmsProperties"
            uri="schemas/JMS_properties.xsd"/>"
     
    </catalog>
    J'ai l'impression que le catalogue n'est pas utilisé. Je n'ai pas trouvé comment faire pour tracer les appels aux catalogues. Je ne sais plus quoi essayer donc si une bonne âme voulait bien se pencher sur mon petit problème, ce serait méga cool

  2. #2
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,

    Citation Envoyé par be_tnt
    Je n'ai pas trouvé comment faire pour tracer les appels aux catalogues.
    Je n'ai jamais utilisé de catalogue avec Xerces, je ne peux donc pas t'aider à trouver la source du problème. 2 choses toutefois :
    • je ne suis pas sûr que l'usage d'une URL relative soit bien indiqué dans l'attribut uri
    • tu peux facilement tracer les appels aux catalogue en utilisant une classe fille de XMLCatalogResolver dans laquelle tu auras implémentée tes propres méthodes resolveURI, resolveEntity, etc.

    Voilà, c'est tout ce que je peux t'indiquer pour l'instant...
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre éclairé Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Par défaut
    Bon voilà j'ai enfin un truc qui fonctionne

    Je ne devais pas mettre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    builder.setEntityResolver(catalog1);
    Mais plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    domFactory.setAttribute("http://apache.org/xml/properties/internal/entity-resolver", catalog);
    De même pour la validation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    validator.setProperty("http://apache.org/xml/properties/internal/entity-resolver", catalog);
    De cette manière, le catalogue est "enregistré" comme étant un LSResourceResolver (utilsant le "target namespace" pour trouver les copies locales des schémas XML) et non pas comme un EntityResolver (qui lui utilise le systemID et le publicID).

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

Discussions similaires

  1. [DOM] [Xerces] Insertion d'une entité
    Par Traroth dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 19/05/2008, 09h28
  2. [Xerces] Comment implémenter Xerces?
    Par be_tnt dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 20/09/2006, 15h24
  3. Problèmes de versions avec Xalan, Xerces et Java
    Par honeyz dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 05/06/2003, 10h18
  4. Réponses: 2
    Dernier message: 06/07/2002, 12h36
  5. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19

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