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

Valider XML Discussion :

[Xerces] [Java] whitespaces et schemaLocation


Sujet :

Valider XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 23
    Points : 20
    Points
    20
    Par défaut [Xerces] [Java] whitespaces et schemaLocation
    Je suis en train de parser de l'XML avec Xerces-Java, et je me retrouve face a 2 petits problemes.

    1) J'aimerais faire disparaitre les text nodes correspondant aux whitespaces (genre newlines) automatiquement au parsage (il y a moyen, non ?)

    2) Pourquoi je n'arrive pas a trouver mon Schéma précisé avec schemaLocation quand je précise un chemin relatif (ce qui marche quand je valide avec oXygen XML editor, un plugin Eclipse) ?

    Je mets ci-dessous un extrait de l'XML, du Schéma et du code 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
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                elementFormDefault="qualified"
                targetNamespace="myNS">
        <xsd:element name="profile">
            <xsd:complexType>
                    <xsd:element name="task">
                        <xsd:complexType>
                                <xsd:element name="Misc">
                                    <xsd:complexType>
                                        <xsd:choice>
                                            <xsd:element name="login">
                                                <xsd:complexType/>
                                            </xsd:element>
                                            <xsd:element name="logout">
                                                <xsd:complexType/>
                                            </xsd:element>
                                        </xsd:choice>
                                    </xsd:complexType>
                                </xsd:element>
                        </xsd:complexType>
                    </xsd:element>
                <xsd:attribute name="name" use="required"/>
            </xsd:complexType>
        </xsd:element>
    </xsd:schema>
    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
    <profile
        xmlns="myNS"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="myNS file:///path/name/hidden/profile.xsd"
        name="Test profile">
        <task>
            <Misc>
                <login/>
            </Misc>
        </task>
        <task>
            <Misc>
                <logout/>
            </Misc>
        </task>
    </profile>
    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
    DOMParser parser = new DOMParser();
    ErrorHandler handler = new ErrorHandler() {
        public void warning(SAXParseException e) throws SAXException {
            System.out.println("[warning] "+e.getMessage());
        }
        public void error(SAXParseException e) throws SAXException {
            System.out.println("[error] "+e.getMessage());
        }
        public void fatalError(SAXParseException e) throws SAXException {
            System.out.println("[fatal error] "+e.getMessage());
            throw e;
        }
    };
    parser.setErrorHandler(handler);
    parser.setFeature("http://xml.org/sax/features/validation", true);
    parser.setFeature("http://apache.org/xml/features/validation/schema", true);
    parser.setFeature("http://apache.org/xml/features/dom/include-ignorable-whitespace",false);
    parser.parse(new InputSource(new FileReader(file)));
    Document doc = parser.getDocument();
    Pour des raisons de "secret industriel", je n'ai fourni qu'un strict minimum, n'hésitez pas à demander plus, je ferais dans la mesure du possible.
    Par ailleurs, ne cherchez pas trop dans le code Java. Il fonctionne au niveau de Java, je n'arrive juste pas a obtenir ce que je veux de Xerces.

    Merci d'avance.

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

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

    pour ton problème d'espaces non significatifs, la réponse est que cette fonctionnalité ne fonctionne qu'avec l'association d'une grammaire DTD. Malheureusement, les W3C XML Schemas ne conviennent pas pour cette fonctionnalité.
    Citation Envoyé par Apache
    The only way that the parser can determine if text is ignorable is by reading the associated grammar and having a content model for the document. When ignorable whitespace text nodes are included in the DOM tree, they will be flagged as ignorable. The ignorable flag can be queried by calling the TextImpl#isIgnorableWhitespace():boolean method. This feature is relevant only when the grammar is DTD.
    Pour ton problème de chemin relatif, c'est un problème récurrent pour lequel je n'ai pas encore trouvé de solution définitive...
    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 à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 23
    Points : 20
    Points
    20
    Par défaut
    bah merci quand même...

    Je suis pas super avancé...

    La question reste ouverte. Si qqn a une réponse ? Je posterai si je trouve une solution.


  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 23
    Points : 20
    Points
    20
    Par défaut
    J'ai trouvé une solution a mon deuxième problème.

    Je lance le parseur a partir d'un objet File de Java. Le parseur n'a donc pas de "System ID" pour le fichier et tente de résoudre le fichier Schéma a partir d'un répertoire qui m'est inconnu.

    J'ai remplacé la ligne en utilisant parse(java.lang.String systemID) et le parseur se débrouille très bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    parser.setFeature("http://xml.org/sax/features/validation", true);
    parser.setFeature("http://apache.org/xml/features/validation/schema", true);
    parser.parse(file.toURI().toString());
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <profile
        xmlns="myNS"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="myNS profile.xsd"
        name="Test profile">
    J'espere que ca servira a qqn d'autre. Quant aux whitespaces, je vais coder moi-meme le "nettoyage" des noeuds texte remplis de whitespace. Si qqn l'a déjà fait, je suis preneur.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 23
    Points : 20
    Points
    20
    Par défaut
    Et voici un code de nettoyage d'arbre DOM. Supprime les noeuds #text qui ne contiennent que du whitespace (selon la définition Java du whitespace, Character.isWhitespace(char c)).

    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
    private void clean (Node n) {
    	Node child = n.getFirstChild();
    	while (child != null) {
    		Node nextChild = child.getNextSibling();
    		if(child.getNodeType() == Node.TEXT_NODE) {
    			String text = child.getNodeValue();
    			boolean onlyWhite = true;
    			for (int j=0;j<text.length() && onlyWhite;j++)
    				if (!Character.isWhitespace(text.charAt(j)))
    					onlyWhite = false; 
    			if (onlyWhite)
    				n.removeChild(child);
    		} else if (child.hasChildNodes()) {
    				clean(child);
    		}
    		child = nextChild;
    	}
    }
    C'est sans doute loin d'être optimisé. Mais si qqn a des idées pour l'améliorer, ou un autre code qui fonctionne, n'hésitez pas à le poster. En attendant, problème résolu.

Discussions similaires

  1. [xsd][Java] Utilité de xsi:schemaLocation ?
    Par tchize_ dans le forum Valider
    Réponses: 6
    Dernier message: 09/09/2009, 10h10
  2. Conflit Struts2/Jena/Xerces sous Java 6
    Par Bobsinglar dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 01/04/2009, 10h21
  3. Réponses: 1
    Dernier message: 18/03/2008, 16h27
  4. [Xerces SAX] NullPointerException : XMLParser.java:1048
    Par Logan Mauzaize dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 23/05/2006, 15h35
  5. 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

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