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 :

Parser Java, SAX, DOM ou JAXB?


Sujet :

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

  1. #1
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut Parser Java, SAX, DOM ou JAXB?
    Bonjour à tous, je viens vous demander votre avis concernant un parser Java.

    J'ai un dossier où se trouve des fichiers : xxx.pdf, xxx.xml, yyy.pdf, yyy.xml etc. avec donc pour chaque fichier pdf son équivalent xml qui décrit les propriétés du fichier.

    Ainsi, via les propriétés, je dois charger dans une application le fichier pdf et à l'aide du fichier de description xml je dois renseigner les propriétés.

    Il y a plusieurs types de documents pdf qui ont des champs différents, mais la structure reste la même pour tous les pdf:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <DOC>
    	<DESC>
    		<TYPEDOC>CV</CODTYPDOC>
    		<DATA>
    			<CLE>NOM</CLE>
    			<VALEUR>LE BARBARE</VALEUR>
    		</DATA>
    		<DATA>
    			<CLE>PRENOM</CLE>
    			<VALEUR>KEUM</VALEUR>
    		</DATA>
    		...
    	</DESC>
    </DOC>
    Sachant que les DATA sont propres a chaque type de document.

    J'ai des contraintes de performances donc je cherche le moyen le plus rapide pour traiter chaque document de façon à renseigner ses propriétés par rapport à son TYPDOC. C'est-à-dire que je souhaite ajouter à mon application un document du type TYPDOC et créer une collection de propriétés qui sera chargée dans mon application.

    J'espère avoir été assez clair, merci de votre attention, toute aide est la bienvenue.

    Cordialement

    Keum

  2. #2
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut
    J'ai décidé de partir sur du DOM vu la faible taille du fichier XML.
    Par contre je me retrouve avec un problème tout con, il tente à tout prix de valider mon document XML avec la DTD. J'ai regardé sur le forum les différentes options pour schuinter le doctype, et j'ai pas compris l'histoire de faire son propre entityresolver.
    J'ai également testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();
    			fabrique.setValidating(false);
    Mais cela merde toujours

    Qui peut m'éclaircir sur le sens de :
    Que tu valides ou pas ton document avec la DTD le parser va essayer d'acceder aux entites externes.

    Si tu veux eviter ca il faut que tu fournisse ton propre EntityResolver en plus ca te permet de recuperer le nom de la DTD.
    Où dois-je mettre mon EntityResolver? Autre classe, dans mon constructeur?

    merci d'avance

  3. #3
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Cela veut dire que si tu fais référence a une entité externe dans ton XML, que tu valides l'XML ou pas, le parser essaiera de localiser cette entité externe.

    Si tu fournis ton propre entity resolver (attention de ne pas faire n'importe quoi non plus) il t'est possible dans ce cas de retourner l'InputSource que l'on veut.. pour par exemple ne pas utiliser une DTD et ne pas la chercher qq part .. ça aide surtout si elle n'est pas fournie

    Sur le DocumentBuilder il est possible de faire un setEntityResolver, le nom de la méthode semble pourtant assez explicite..
    Pour éviter les problèmes dans le cas de la DTD qui nous intéresse et uniquement dans ce cas je retournerais un InputSource vide (i.e. ne contenant pas de donnée).
    Ce qu'il faut savoir c'est que si l'EntityResolver retourne null, dans ce cas le comportement par défaut du parser est utilisé pour localiser la DTD, ce qui n'est pas ce que l'on veut ici.

    Bulbo

  4. #4
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut
    Merci de ta réponse.

    J'ai déjà tenté le setResolveEntity, mais je ne dois pas passer ce qu'il faut ou alors ce que je donne en paramètre vaut null car cela ne fonctionne pas pour le moment.

    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
    	public XMLParser(String path) {
    		//Chargement du document
    		try{
    			factory = DocumentBuilderFactory.newInstance();
    			builder = factory.newDocumentBuilder();
    			builder.setEntityResolver(new EntityResolver() {
     
    				public InputSource resolveEntity(String publicId, String systemId)
    						throws SAXException, IOException {
    					InputSource dtd = new InputSource();
    					InputStream is = new InputStream() {
     
    						public int read() throws IOException {
    							// TODO Auto-generated method stub
    							return 1;
    						}
    					};
    					dtd.setByteStream(is);
     
    					return dtd;
    				}
    			});
    			doc = builder.parse(new File(path));
    			this.nroot = doc.getDocumentElement();
    		}
    		catch(Exception e){
    			e.printStackTrace();
    		}
    	}
    Je n'ai plus la même erreur, mais celle ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [Fatal Error] 209C.BLAN.VLFACRBO.0822.16.54.48_L0006400005.xml:1:1: The markup declarations contained or pointed to by the document type declaration must be well-formed.
    org.xml.sax.SAXParseException: The markup declarations contained or pointed to by the document type declaration must be well-formed.
    	at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
    	at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    	at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
    	at com.groupama.parser.XMLParser.<init>(XMLParser.java:54)
    	at com.groupama.parser.XMLParser.main(XMLParser.java:101)
    Exception in thread "main" java.lang.NullPointerException
    	at com.groupama.parser.XMLParser.getProperties(XMLParser.java:77)
    	at com.groupama.parser.XMLParser.main(XMLParser.java:103)
    Je dois surement mal m'y prendre, je tente des trucs mais sans savoir où je vais...

    Merci en tout cas

  5. #5
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Essaye voir ça en guise d'InputSource:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InputSource dtd = new InputSource(new StringReader(""));
    Bulbo

  6. #6
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut
    Le moins que l'on puisse dire c'est que c'est tout con, et que ca marche



    Merci

    Keum

  7. #7
    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
    Citation Envoyé par keumlebarbare Voir le message
    Le moins que l'on puisse dire c'est que c'est tout con, et que ca marche
    Tant mieux pour toi, mais il serait quand même plus judicieux soit de récupérer les DTD et les placer dans un espace accessible au parser (grace à l'entityResolver) ; il ne faut pas oublier que les DTD ne servent pas qu'à la validation mais aussi à la déclaration d'entités internes et externes.

  8. #8
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 162
    Points : 70
    Points
    70
    Par défaut
    Tout à fait, mais je me charge d'un injecteur de données et les fichiers xml sont des descripteurs. Je n'ai pas accès pour le moment en tout cas au fichier, ne serait-ce que pour le récupérer. Mais dès que je l'aurais alors je mettrais en place la phase de validation, bien entendu.

    Merci de vos réponses en tout cas.

    Keum

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

Discussions similaires

  1. Votre avis: pour parser XML, la librarie SAX, Dom, JDom ou d'autre librairie
    Par jean1979 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 21/10/2011, 10h36
  2. Dans quels cas choisir entre SAX, DOM, JAXB, ou XPath ?
    Par anubiiis dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 06/04/2009, 09h14
  3. TNSnames parser java
    Par spam8you dans le forum Oracle
    Réponses: 1
    Dernier message: 11/06/2007, 12h10
  4. [débutant] Parser java
    Par hariri dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 10/05/2007, 14h02
  5. Parser XML / SAX vs Serialisation
    Par phoeb32 dans le forum Persistance des données
    Réponses: 1
    Dernier message: 17/04/2007, 10h41

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