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 :

Utilisation de 'processingInstruction' [SAX]


Sujet :

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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    kij
    kij est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Par défaut Utilisation de 'processingInstruction'
    Bonjour,

    Dans l'un de mes programmes, je dois parser des fichiers XML dont la taille peut être énorme (quelques GB).
    Il est donc hors de question pour moi d'utiliser DOM qui il me semble, charge plus ou moins la structure du fichier XML en mémoire.

    J'utilise donc SAX pour parser et traiter au fur et à mesure mes fichiers XML.
    Seulement j'aimerai récupérer les informations qui se trouvent en dehors de l'arbre XML, c'est à dire <?xml ... > et le <!DOCTYPE .... >

    J'ai lu que la fonction 'processingInstruction' est normalement chargée d'être appelée pour traité ce genre d'information, j'ai donc overwrite cette méthode dans mon Handler associé au parser.
    Hors, si j'affiche une trace toute simple (via Log4j), je n'ai rien en sortie standard lorsque j'exécute mon programme (pourtant j'ai bien d'autres traces d'affichée qui prouve que le fichier est correctement parsé).

    Sauriez-vous pourquoi cela ne fonctionne pas ?

    Code simpliste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    	public void processingInstruction(String target, String data)
    			throws SAXException {
    		System.out.println("Processing instruction : "+target+" / "+data);
    	}
    S'il n'est plus possible d'utiliser cette méthode, en existe-t-il une autre ? (si oui il faudrait mettre à jour les FAQ et tutorial du site, sauf erreur de ma part)

    En vous remerciant d'avance pour votre aide.

    Cdlt.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par kij Voir le message
    Il est donc hors de question pour moi d'utiliser DOM qui il me semble, charge plus ou moins la structure du fichier XML en mémoire.
    Pas "plus ou moins." Le principe est de charger entièrement le document en mémoire dans une structure DOM, point.

    Citation Envoyé par kij Voir le message
    Seulement j'aimerai récupérer les informations qui se trouvent en dehors de l'arbre XML, c'est à dire <?xml ... > et le <!DOCTYPE .... >

    J'ai lu que la fonction 'processingInstruction' est normalement chargée d'être appelée pour traité ce genre d'information
    Ah, non.

    <!DOCTYPE .... > n'est pas une processing instruction, et n'y ressemble pas non plus. Le DocType c'est le DocType, il y en a au plus un par document, toujours avant l'élément racine.

    <?xml ... ?> ressemble à une processing instruction, c'est vrai... Mais ce n'en est pas une. C'est la déclaration XML. Il ne peut y en avoir qu'une, et s'il y en a une elle est au tout début du fichier. Elle indique la version XML, l'encodage de caractère utilisé, et si le document est "standalone".

    Bon, comment les lire en SAX... Ben je sais pas -_-°.

    A priori la définition de SAX ne prévoit rien pour lire la déclaration XML, car ces informations concernent le parseur XML et le validateur. Pas ce qui s'en sert.
    Certaines APIs SAX permettent peut-être de récupérer l'info quand même, je ne sais pas.


    Pour le DocType, on peut récupérer une partie de ses informations en faisant implémenter LexicalHandler à son ContentHandler.
    La méthode startDTD(String name, String publicId, String systemId) est appelée à lecture du DocType.

    Si la déclaration est de la forme
    <!DOCTYPE name PUBLIC "PUBLIC ID" "system_id.dtd">

    Alors name sera "name", publicId sera "PUBLIC ID" et systemId sera "system_id.dtd"
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    kij
    kij est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Par défaut
    Bonjour,

    Et merci pour la réponse.

    En fait je pensais que la méthode 'processingInstruction' était appelée suite à cette page:
    http://smeric.developpez.com/java/cours/xml/sax/

    Où il est spécifié que <?xml ... ?> appelle bien cette méthode. Mais en y faisant gaffe, effectivement l'article date de 2003 et n'est certainement plus d'actualité.

    Impeccable pour récupérer le nom de mon main tag et la DTD via ce que tu m'a donné, merci bien donc.
    Pour ce qui est de l'xml de début, je peux m'en passer au final je pense, vu que de toute manière toute la donnée de sortie est convertie en UTF-8, la déclaration sera toujours la même.

    Thanks

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

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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