OVH Cloud OVH Cloud

Arrêter le parser SAX

18 réponses
Avatar
SK
Bonjour,

J'utilise actuellement un parser SAX pour lire un fichier XML.
Existerait-il un moyen de le stopper (lors de la rencontre d'une fin de
balise précise, par exemple) et donc l'empêcher de parcourir tout le
document (qui est assez gros) ?
C'est aussi parce que je n'ai besoin que d'en récupérer une sous-partie.

Merci d'avance pour vos réponses.

10 réponses

1 2
Avatar
ali k
Bonjour,

J'utilise actuellement un parser SAX pour lire un fichier XML.
Existerait-il un moyen de le stopper (lors de la rencontre d'une fin de
balise précise, par exemple) et donc l'empêcher de parcourir tout le
document (qui est assez gros) ?
C'est aussi parce que je n'ai besoin que d'en récupérer une sous-partie.

Merci d'avance pour vos réponses.


dans la mesure où sax parse séquentiellement, ligne par ligne, est-ce
qu'un compteur de ligne ne suffirait pas ?
où mieux, mettre une balise en condition d'arrêt ?

Avatar
SK
dans la mesure où sax parse séquentiellement, ligne par ligne, est-ce
qu'un compteur de ligne ne suffirait pas ?
où mieux, mettre une balise en condition d'arrêt ?


Malheureusement, le nombre de ligne n'est pas connu à l'avance.
Sinon je veux bien donner une sémantique d'arrêt à un certain type de
balise mais comment dire au parser SAX de s'arrêter dès qu'elle
rencontre cette balise justement ?

Avatar
ali k

dans la mesure où sax parse séquentiellement, ligne par ligne, est-ce
qu'un compteur de ligne ne suffirait pas ?
où mieux, mettre une balise en condition d'arrêt ?



Malheureusement, le nombre de ligne n'est pas connu à l'avance.
Sinon je veux bien donner une sémantique d'arrêt à un certain type de
balise mais comment dire au parser SAX de s'arrêter dès qu'elle
rencontre cette balise justement ?
Quel parser utilises-tu ?



Avatar
SK
ali k wrote:
Quel parser utilises-tu ?


J'utilise parser par défaut de Java : org.apache.crimson.
Enfin, vu que je souhaite un code portable, je préfère ne pas trop
m'appuyer sur des features non standards.

Avatar
Unknown
Le Wed, 26 May 2004 20:53:57 +0200, SK a écrit :

ali k wrote:
Quel parser utilises-tu ?


J'utilise parser par défaut de Java : org.apache.crimson.


lol, apache c'est le parser par défaut de java maintenant.
sinon utilise JDOM (www.jdom.org) c'est tres simple a utiliser.
Pour obtenir tes composants tu fais du
rootElement.getChildren("NOMDUTAG"); ou rootElement.getCHild("nombis");

Enfin, vu que je souhaite un code portable, je préfère ne pas trop
m'appuyer sur des features non standards.


ben jdom tu livres le jar et ca roule


Avatar
SK
Unknown wrote:
lol, apache c'est le parser par défaut de java maintenant.
sinon utilise JDOM (www.jdom.org) c'est tres simple a utiliser.
Pour obtenir tes composants tu fais du
rootElement.getChildren("NOMDUTAG"); ou rootElement.getCHild("nombis");


Enfin, vu que je souhaite un code portable, je préfère ne pas trop
m'appuyer sur des features non standards.



ben jdom tu livres le jar et ca roule


Tu aurais peut-être du lire le message d'origine avant de poster ta
réponse. Sache que je travaille en SAX et que le parser fourni avec le
SDK Java de Sun est bien le Crimson d'Apache (dont le parseur Xerces est
bien connu). Je sais très bien utiliser DOM, merci, mais pour rappeler
mon problème je cherche à arrêter le parser SAX après la rencontre d'une
certaine balise pour éviter de lui faire parcourir tout le fichier.

Merci d'avance pour quiconque aurait un élément réponse.


Avatar
ali k
ali k wrote:

Quel parser utilises-tu ?



J'utilise parser par défaut de Java : org.apache.crimson.
Enfin, vu que je souhaite un code portable, je préfère ne pas trop
m'appuyer sur des features non standards.
Quel est le problème vu qu'à la fin c'est du bytecode que tu obtiens ?

Une fois compilé, il sera de toute façon portable puisque destiné à
tourner sur une JVM (à moins que la JVM ne soit pas à jour).

J'opterai pour la création d'un fichier temporaire s'arrêtant à la ligne
désirée pour ensuite parser ce fichier temporaire :
grossierement si tu veux t'arreter à la balise </fin> du fichier
"exemple.xml". (A vérifier)

File tmpfile = File.createTempFile("xxx","tmp");
BufferedReader br new BufferedReader(newputStreamReader("exemple.xml"));
PrintWriter pw = new PrintWriter(new FileOutputStream(tmpfile));
String ligne = null;
while (!(ligne = br.readLine()).startsWith("</fin>")
pw.println(ligne);
pw.println(ligne); //on ajoute la balise </fin>
pw.close();
br.close();
XMLReader reader XMLReaderFactory.createXMLReader();
InputSource is = new InputSource(tmpfile);
reader.parse(is);

Attention, contrairement à ce que raconte notre ami inconnu, jdom n'est
pas plus facile ni mieux que sax. Le dom est une toute autre approche du
parsing xml. Le choix du sax ou du dom dépend avant tout des besoins
(mémoire, rapidité ...)


Avatar
Marc Petit-Huguenin
SK wrote:
Bonjour,

J'utilise actuellement un parser SAX pour lire un fichier XML.
Existerait-il un moyen de le stopper (lors de la rencontre d'une fin de
balise précise, par exemple) et donc l'empêcher de parcourir tout le
document (qui est assez gros) ?
C'est aussi parce que je n'ai besoin que d'en récupérer une sous-partie.

Merci d'avance pour vos réponses.


try {
SaxParserFactory.newInstance().newSaxParser().parse(inputStream, new
DefaultHandler() {
public void endElement(String uri, String localName, String qName) {
if (localName.equals("myelement")) {
throw new RuntimeException();
}
}
});
}
catch (SAXException e) {
if (e.getException() instanceof RuntimeException) {
//
}
}

Avatar
Cheyenne
SK writes:

Bonjour,


Bonsoir,


J'utilise actuellement un parser SAX pour lire un fichier XML.
Existerait-il un moyen de le stopper (lors de la rencontre d'une fin de
balise précise, par exemple) et donc l'empêcher de parcourir tout le
document (qui est assez gros) ?
C'est aussi parce que je n'ai besoin que d'en récupérer une sous-part ie.


En désespoir de cause, il y aurait bien la possibilité de balancer une
exception, mais c'est goret.


Merci d'avance pour vos réponses.
HTH

--
Jérôme Marrec

Les enfants naissent à l'aube
Ils se suicident en Juin
-- Bérurier noir - Mineurs en danger

Avatar
Unknown
Attention, contrairement à ce que raconte notre ami inconnu, jdom n'est
pas plus facile ni mieux que sax. Le dom est une toute autre approche du
parsing xml. Le choix du sax ou du dom dépend avant tout des besoins
(mémoire, rapidité ...)


Petite précision, JDOM est juste un nom générique, a l'intérieur il y
a un SAXBuilder qui parse en SAX.

1 2