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 :

UTF-8 Différence SAX et DOM


Sujet :

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

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 56
    Points : 43
    Points
    43
    Par défaut UTF-8 Différence SAX et DOM
    Bonjour,

    Voila, j'ai apparemment un problème de charset avec certain fichier XML que l'on reçoit d'un client. Les applications qui le traite utilise JAxp pour charger le fichier dans un Document (Jdom) et également Xalan pour y appliquer des transformation XSLT. Certains de ces fichiers ne sont pas traité avec comme exception une erreur comme quoi un caractère n'est pas UTF-8 (invalid byte 3 of 3 ou un message du genre) que ce soit pour le charger dans un object Dom ou pour le parser via xalan.

    Le client de son coté nous affirme que l'XML, qui est généré via Word et Nuxeo est conforme au standard W3C et qu'un parser peut le lire.

    Lorsque j'essaye de parser l'XML avec SAX, il n'y a effectivement aucun problème. De même, si je charge l'Xml dans un programme comme XML spy, je n'ai aucun problème de validation et la transformation XSLT, qui utilise également xalan, fonctionne aussi.

    Je pense que le problème vient de caractère propre à Word comme le "beautifull quote" et autre.

    Ou est donc l'erreur ? Est-ce que DOm n'est pas 100% comptabible W3C ? Est-ce qu'Xml Spy et sax sont plus complaisant ? Comment savoir si le document réponds effectivement aux normes W3C ?

    j'avoue que je suis un peu perdus

    Existe-t-il un moyen de vérifier que le fichier est conforme au stadnard W3C ? j'ai trouvé des validateur pour les schèma mais pas pour un fichier Xml

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 56
    Points : 43
    Points
    43
    Par défaut
    Bon ben j'ai trouvé un validateur en ligne ... je cherchais sur le site W3c alors qu'il était dans le W3c School. Pour ceux que ça intéresse :

    validateur xml

    Je laisse néanmoins ouvert car j'aimerais savoir pourquoi SAX l'accepte.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    En général quand ce genre de choses arrivent, c'est qu'un traitement a été fait sur le fichier avant de le passer par le parseur XML, et que ce traitement modifie ou carrément corrompt l'encodage du fichier.

    En général ce traitement est involontaire, et les responsables jurent leurs grands dieux qu'ils ne font rien de ce genre, mais ils se trompent.

    Ça peut être la réception du fichier et son enregistrement qui passent par une phase texte char / String au lieu de byte et se trompe dans l'encodage.
    Ça peut être que le XML est passé au parseur sous forme de String ou de Reader au lieu de fichier et que l'encodage employé est erroné.
    Ça peut être n'importe quoi entre les deux.

    Citation Envoyé par Eylir Voir le message
    Je pense que le problème vient de caractère propre à Word comme le "beautifull quote" et autre.
    Si SAX ne dit rien, le problème n'est pas là.

    Est-ce que DOm n'est pas 100% comptabible W3C ?
    DOM est défini par le W3C, pour être une représentation objet navigable et modifiable d'un document XML.
    Autrement dit, si, c'est même sa raison d'être.

    Est-ce qu'Xml Spy et sax sont plus complaisant ?
    Selon certaines conditions ces programmes peuvent être configurés pour être plus ou moins laxistes, mais ça n'a pas l'air d'être ça.

    Comment savoir si le document réponds effectivement aux normes W3C ?
    Normalement, simplement l'ouvrir dans un truc genre XmlSpy ou le faire parser en SAX est suffisant...

    Edit : Du coup, le fichier envoyé par le client est bel et bien invalide ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 56
    Points : 43
    Points
    43
    Par défaut
    je ne saurais pas dire si le fichier est valide ou non mais il y a bien un problème au niveau de l'encodage puisque le validateur mis à disposition par le W3c le renvoie également.

    Si il y a transformation, elle vient de nuxeo (que je ne connais absolument pas) mais rien n'est modifié par rapport au fichier que je reçois avant de le passer au parser.

    Si j'ai parlé de ces beautiful quote, c'est parce que j'avais déjà eu le cas et que Xalan les rejetés.

    Par contre, je ne m'explique pas que Sax le parse sans broncher. Maintenant, je n'ai encore jamais eu a utiliser SAX et je n'ai fait qu'un petit bout de code juste pour vérifier que Sax le traitait effectivement.

    pour info, voila le code


    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
    		public static void testparsing(ByteArrayInputStream a) {
    		ContentHandler contentHandler = new XmlContentHandler();
    		ErrorHandler errorHandler = new XmlErrorHandler();
    		try {
    			XMLReader parser = new com.sun.org.apache.xerces.internal.parsers.SAXParser();
    			parser.setContentHandler(contentHandler);
    			parser.setErrorHandler(errorHandler);
    			InputStream input = a;
    			InputSource inputsource = new InputSource(input);
    			parser.parse(inputsource);
     
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (SAXException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    	}
    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
    80
    81
    82
    83
    public class XmlContentHandler implements ContentHandler {
    	private Locator locator;
     
    	public void characters(char[] ch, int start, int length)
    			throws SAXException {
    		String s = new String(ch, start, length);
    		System.out.println("characters: " + s);
     
    	}
     
    	public void endDocument() throws SAXException {
    		System.out.println("...Parsing ends.");
     
    	}
     
    	public void endElement(String uri, String localName, String name)
    			throws SAXException {
    		// TODO Auto-generated method stub
     
    	}
     
    	public void endPrefixMapping(String prefix) throws SAXException {
    		System.out.println("Mapping ends for prefix " + prefix);
     
    	}
     
    	public void ignorableWhitespace(char[] ch, int start, int length)
    			throws SAXException {
    		String s = new String(ch, start, length);
    		System.out.println("ignorableWhitespace: [" + s + "]");
     
    	}
     
    	public void processingInstruction(String target, String data)
    			throws SAXException {
    		System.out.println("PI: Target:" + target + " and Data:" + data);
     
    	}
     
    	public void setDocumentLocator(Locator locator) {
    		System.out.println("    * setDocumentLocator() called");
    		this.locator = locator;
     
    	}
     
    	public void skippedEntity(String name) throws SAXException {
    		System.out.println("Skipping entity " + name);
     
    	}
     
    	public void startDocument() throws SAXException {
    		System.out.println("Parsing begins...");
     
    	}
     
    	public void startElement(String uri, String localName, String name,
    			Attributes atts) throws SAXException {
    		 System.out.print("startElement: " + localName); 
    	        if (!uri.equals("")) { 
    	            System.out.println(" in namespace " + uri + 
    	                               " (" + atts + ")"); 
    	        } else { 
    	            System.out.println(" has no associated namespace"); 
    	        } 
    	        for (int i=0; i<atts.getLength(); i++) {
    	            System.out.println("  Attribute: " + atts.getLocalName(i) + 
    	                               "=" + atts.getValue(i));
    	        if (atts.getLocalName(i).equalsIgnoreCase("h-ansi")){
    	        	skippedEntity(uri);
    	        	System.out.println("this attribute is skipped");
    	        }
    	        }
     
    	}
     
    	public void startPrefixMapping(String prefix, String uri)
    			throws SAXException {
    		System.out.println("Mapping starts for prefix " + prefix
    				+ " mapped to URI " + uri);
     
    	}
     
    }
    Je précise que le stream en entrée a été testé et qu'il est identique au fichier.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par Eylir Voir le message
    Si il y a transformation, elle vient de nuxeo (que je ne connais absolument pas) mais rien n'est modifié par rapport au fichier que je reçois avant de le passer au parser.
    Euh, oui, tu as fait quoi du passage où j'explique qu'en général, les gens ne savent pas qu'ils font ce genre de traitement ?

    En gros je disais que si tu ne touches pas à ce fichier, il va falloir le prouver :
    - D'où vient ce fichier et comment t'y prends-tu pour le prendre de là ?
    - Une fois que le fichier est récupéré, comment t'y prends-tu pour le passer au parseur ?

    on pourra voir si tu fais un traitement dessus ou pas.

    Si j'ai parlé de ces beautiful quote, c'est parce que j'avais déjà eu le cas et que Xalan les rejetés.
    Oui, c'est pas impossible, mais ça aurait pu être parce qu'ils n'avaient rien à faire là où ils étaient, par exemple. Disons qu'à partir du moment où un caractère est collable dans un fichier texte, alors ce n'est pas lui qui provoque les erreurs de mauvais encodage. Ce qui provoque les erreurs de mauvais encodage, c'est un mauvais encodage.

    Par contre, je ne m'explique pas que Sax le parse sans broncher. Maintenant, je n'ai encore jamais eu a utiliser SAX et je n'ai fait qu'un petit bout de code juste pour vérifier que Sax le traitait effectivement.

    pour info, voila le code
    Ce code-là m'a l'air parfaitement correct, encore que je me demande d'où vient le ByteArrayInputStream, mais a priori il y a peu de place pour une erreur ici. Ce qui peut être la raison pour laquelle SAX ne se plaint pas.

    Je précise que le stream en entrée a été testé et qu'il est identique au fichier.
    En fait je n'en doute pas, mais au cas où on va faire comme le passage au parseur : prouve-le .
    Quelle méthode a été employée pour comparer les fichiers ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [StAX] Différences SAX et StAX
    Par thierry_b dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 19/10/2009, 13h55
  2. SAX ou DOM pour génération XML ?
    Par shadeoner dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 30/08/2008, 14h15
  3. [SAX] SAX ou DOM ?
    Par Tijee dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 29/01/2008, 14h59
  4. [JAXP 1.2] Valider XML par schéma externe avec SAX (voire DOM)
    Par g_rare dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 17/07/2006, 19h48
  5. [parsage] SAX ou DOM ?
    Par sixkiller dans le forum APIs
    Réponses: 4
    Dernier message: 10/05/2004, 10h40

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