Aller au contenu

SAX et Java


pathos_01

Messages recommandés

Bonsoir,

je suis étudiant en informatique et je dois réaliser une application.

dans celle-ci je doit parser une fichier XML de 484 Mo qui ressemble a ça (morceaux du XML)

<?xml version="1.0" encoding="iso-8859-1"?>
<dblp>
<incollection mdate="2002-01-03" key="books/acm/kim95/AnnevelinkACFHK95">
 <author>Jurgen Annevelink</author> 
 <author>Rafiul Ahad</author> 
 <author>Amelia Carlson</author> 
 <author>Daniel H. Fishman</author> 
 <author>Michael L. Heytens</author>
 <author>William Kent</author> 
 <title>Object SQL - A Language for the Design and Implementation of Object Databases.</title> 
 <pages>42-68</pages> 
 <year>1995</year> 
 <booktitle>Modern Database Systems</booktitle> 
 <url>db/books/collections/kim95.html#AnnevelinkACFHK95</url> 
 </incollection>
<incollection mdate="2002-01-03" key="books/acm/kim95/Blakeley95">
 <author>José A. Blakeley</author> 
 <title>OQL[C++]: Extending C++ with an Object Query Capability.</title> 
 <pages>69-88</pages> 
 <booktitle>Modern Database Systems</booktitle> 
 <url>db/books/collections/kim95.html#Blakeley95</url> 
 <year>1995</year> 
 </incollection>
<incollection mdate="2004-03-08" key="books/acm/kim95/BreitbartGS95">
 <author>Yuri Breitbart</author> 
 <author>Hector Garcia-Molina</author> 
 <author>Abraham Silberschatz</author> 
 <title>Transaction Management in Multidatabase Systems.</title> 
 <pages>573-591</pages> 
 <booktitle>Modern Database Systems</booktitle> 
 <crossref>books/acm/Kim95</crossref> 
 <url>db/books/collections/kim95.html#BreitbartGS95</url> 
 <year>1995</year> 
 </incollection>
<incollection mdate="2004-03-08" key="books/acm/kim95/BreitbartR95">
 <author>Yuri Breitbart</author> 
 <author>Tom C. Reyes</author> 
 <title>Overview of the ADDS System.</title> 
 <pages>683-701</pages> 
 <booktitle>Modern Database Systems</booktitle> 
 <crossref>books/acm/Kim95</crossref> 
 <url>db/books/collections/kim95.html#BreitbartR95</url> 
 <year>1995</year> 
 </incollection>
-<incollection mdate="2002-01-03" key="books/acm/kim95/ChristodoulakisK95">
<author>Stavros Christodoulakis</author> 
 <author>Leonidas Koveos</author> 
 <title>Multimedia Information Systems: Issues and Approaches.</title> 
 <pages>318-337</pages> 
 <year>1995</year> 
 <booktitle>Modern Database Systems</booktitle> 
 <url>db/books/collections/kim95.html#ChristodoulakisK95</url> 
 </incollection>
<incollection mdate="2002-01-03" key="books/acm/kim95/DayalHW95">
 <author>Umeshwar Dayal</author> 
 <author>Eric N. Hanson</author> 
 <author>Jennifer Widom</author> 
 <title>Active Database Systems.</title> 
 <pages>434-456</pages> 
 <year>1995</year> 
 <booktitle>Modern Database Systems</booktitle> 
 <url>db/books/collections/kim95.html#DayalHW95</url> 
 </incollection>
 <incollection mdate="2002-01-03" key="books/acm/kim95/DittrichD95">
 <author>Angelika Kotz Dittrich</author> 
 <author>Klaus R. Dittrich</author> 
 <title>Where Object-Oriented DBMSs Should Do Better: A Critique Based on Early Experiences.</title> 
 <pages>238-254</pages> 
 <year>1995</year> 
 <booktitle>Modern Database Systems</booktitle> 
 <url>db/books/collections/kim95.html#DittrichD95</url> 
 </incollection>
<incollection mdate="2002-01-03" key="books/acm/kim95/Garcia-MolinaH95">
 <author>Hector Garcia-Molina</author> 
 <author>Meichun Hsu</author> 
 <title>Distributed Databases.</title> 
 <pages>477-493</pages> 
 <year>1995</year> 
 <booktitle>Modern Database Systems</booktitle> 
 <url>db/books/collections/kim95.html#Garcia-MolinaH95</url> 
 </incollection>
<incollection mdate="2002-01-03" key="books/acm/kim95/Goodman95">
 <author>Nathan Goodman</author> 
 <title>An Object-Oriented DBMS War Story: Developing a Genome Mapping Database in C++.</title> 
 <pages>216-237</pages> 
 <year>1995</year> 
 <booktitle>Modern Database Systems</booktitle> 
 <url>db/books/collections/kim95.html#Goodman95</url> 
 </incollection>
  <incollection mdate="2002-01-03" key="books/acm/kim95/Kaiser95">
 <author>Gail E. Kaiser</author> 
 <title>Cooperative Transactions for Multiuser Environments.</title> 
 <pages>409-433</pages> 
 <year>1995</year> 
 <booktitle>Modern Database Systems</booktitle> 
 <url>db/books/collections/kim95.html#Kaiser95</url> 
</incollection>
<incollection mdate="2004-03-08" key="books/acm/kim95/KelleyGKRG95">
 <author>William Kelley</author> 
 <author>Sunit K. Gala</author> 
 <author>Won Kim</author> 
 <author>Tom C. Reyes</author> 
 <author>Bruce Graham</author> 
 <title>Schema Architecture of the UniSQL/M Multidatabase System</title> 
 <booktitle>Modern Database Systems</booktitle> 
 <crossref>books/acm/Kim95</crossref> 
 <pages>621-648</pages> 
 <year>1995</year> 
 <url>db/books/collections/kim95.html#KelleyGKRG95</url> 
 </incollection>
<incollection mdate="2002-01-03" key="books/acm/kim95/KemperM95">
 <author>Alfons Kemper</author> 
 <author>Guido Moerkotte</author> 
 <title>Physical Object Management.</title> 
 <pages>175-202</pages> 
 <year>1995</year> 
 <booktitle>Modern Database Systems</booktitle> 
 <url>db/books/collections/kim95.html#KemperM95</url> 
 </incollection>
  <incollection mdate="2002-01-03" key="books/acm/kim95/Kim95">
 <author>Won Kim</author> 
 <title>Introduction to Part 1: Next-Generation Database Technology.</title> 
 <pages>5-17</pages> 
 <year>1995</year> 
 <booktitle>Modern Database Systems</booktitle> 
 <url>db/books/collections/kim95.html#Kim95</url> 
 </incollection>
<incollection mdate="2002-01-03" key="books/acm/kim95/Kim95a">
 <author>Won Kim</author> 
 <title>Object-Oriented Database Systems: Promises, Reality, and Future.</title> 
 <pages>255-280</pages> 
 <year>1995</year> 
 <booktitle>Modern Database Systems</booktitle> 
 <url>db/books/collections/kim95.html#Kim95a</url> 
 </incollection>
</dblp>

pour faire cela j'utilise SAX :

/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2008</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
// Parse un document XML en JAVA avec l'Api SAX

//on importe les API necessaires
//pour l'analyse du XML
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
//pour l'acces aux fichiers
import java.io.*;
import java.util.ArrayList;

public class SAXParserXML extends DefaultHandler {
boolean author=false;
char[] buffer;
int off;
int length;
 ArrayList Author = new ArrayList(); //tableau dynamique pour le stockage des personnes
public static void ParcourXML() {

	DefaultHandler handler = new SAXParserXML();
	SAXParserFactory factory = SAXParserFactory.newInstance();
	try {
		String URI = "C:/Documents and Settings/Anthony.PATHOS/Bureau/CodeMomo/dblp.xml";
		SAXParser saxParser = factory.newSAXParser();
		saxParser.parse(URI,handler);
	} catch (Throwable t) {
		//Si on a une erreur pendant l'analyse
		t.printStackTrace ();
		System.exit (1);
	}
}

public void error(SAXParseException e) throws SAXParseException{
	throw e;
}

public void startDocument () throws SAXException {
	System.out.println("début du document");
}

public void endDocument () throws SAXException {
	System.out.println("fin du document");
   System.out.println("Affichage du tableau de vecteur : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
	for(int i=0;i<Author.size();i++)
	{
		System.out.println(Author.get(i));
	}
}

public void startElement (String namespaceURI,String simpleName,String qualifiedName,Attributes attrs) throws SAXException {
	String qName = simpleName;
   if("".equals(qName)){
	   qName = qualifiedName;
   }

	   System.out.println("Balise ouvrante: " + qName);  
	   if (attrs != null) {
		   //listage des attributs
		   if (attrs.getLength() != 0)
			   System.out.println("Paramètre pour " + qName + ":");
		   for (int i = 0; i < attrs.getLength(); i++) {
			   String aName = attrs.getLocalName(i);
			   //récupération du nom de l'attribut
			   if ("".equals(aName)) {
				   aName = attrs.getQName(i);
			   }
			   System.out.println(aName + "=" + attrs.getValue(i) + "");;
		   }
	   }
}
public void endElement (String namespaceURI,String simpleName,String qualifiedName) throws SAXException {
	String nomElement = simpleName;
	if (nomElement.equals("")){
		nomElement = qualifiedName;			
	}
	System.out.println("endElement : " +nomElement);
}

public void characters (char[] ch, int start, int length) throws SAXException {
	String chaine = new String(ch, start, length);
	chaine = chaine.trim();
	if(!chaine.equals("")){
		System.out.println("donnees : " +chaine);
		Author.add(chaine);
	}
}



}//fin de la classe

mon programme parcour parfaitement le fichier XML .

Mon problème est que j'aimerai stocker dans un tableau de vecteur le nom des author -> La je coince ....

dans mon tableau est stocké les author mais aussi d'autre information que je ne souhaite pas.

Si qqn sais comment faire alors je suis ouvert a toute suggestion .

Merci

Lien vers le commentaire
Partager sur d’autres sites

Ok, j'avais pas vu ...

Eh bien ça me paraît logique puisque tu ajoutes tout à la liste sans tester sur quelle balise tu es.

Donc dès qu'une balise a un contenu, tu l'ajoutes dans la liste.

je suis d'accord avec toi ...

mais le problème c'est que je ne sais pas comment faire comprendre a SAX que je veux seulement garder les attribut de la balise <author>

c'est la que je coince !!!

(merci de ton aide)

Lien vers le commentaire
Partager sur d’autres sites

En fait, SAX est un parseur très basique qui se base sur une lecture séquentielle des données (ce qui fait qu'il est + rapide qu'une inspection DOM).

L'inconvénient c'est que c'est à toi de retenir les informations qui t'intéressent au fur et à mesure.

Quand j'ai fait du SAX, j'avais géré ça avec des variables d'instance. Peut être y a-t-il un moyen de faire ça + propre mais bon.

Par exemple tu mets une variable currentMarkup dans laquelle tu stockes la valeur de la balise en cours (dans startElement).

Et ensuite dans la méthode characters tu testes la valeur de currentMarkup pour voir si elle contient "author".

Et une fois dans endElement, tu réinitialises la chaine.

Voilà, si mes souvenirs sont bons ça devrait marcher, mais comme je te le dis, je n'avais pas lu trop de doc sur le parsing SAX et donc ce que je te dis de faire ne correspond peut être pas aux best practices.

Lien vers le commentaire
Partager sur d’autres sites

En fait, SAX est un parseur très basique qui se base sur une lecture séquentielle des données (ce qui fait qu'il est + rapide qu'une inspection DOM).

L'inconvénient c'est que c'est à toi de retenir les informations qui t'intéressent au fur et à mesure.

Quand j'ai fait du SAX, j'avais géré ça avec des variables d'instance. Peut être y a-t-il un moyen de faire ça + propre mais bon.

Par exemple tu mets une variable currentMarkup dans laquelle tu stockes la valeur de la balise en cours (dans startElement).

Et ensuite dans la méthode characters tu testes la valeur de currentMarkup pour voir si elle contient "author".

Et une fois dans endElement, tu réinitialises la chaine.

Voilà, si mes souvenirs sont bons ça devrait marcher, mais comme je te le dis, je n'avais pas lu trop de doc sur le parsing SAX et donc ce que je te dis de faire ne correspond peut être pas aux best practices.

ok merci !

je vais tester ca et je tiens au courant

Lien vers le commentaire
Partager sur d’autres sites

Ben c'est facile :

* tu rajoutes un Vector<String> listOfAuthors;

* tu rajoutes un champ booléen addAuthor = false;

* dans ton startElement(), tu ajoute un if(simpleName.equalsIgnoreCase("author")) addAuthor = true;

* dans endElement(), tu rajoute un addAuthor = false;

* dans characters(), tu rajoute un if(addAuthor) listOfAthors.add(new String(ch, start, length));

Et vires les println(), si ton fichier fait vraiment 400Mio, alors ça va mettre plusieurs minutes au lieu de quelques secondes. :cartonrouge:

Lien vers le commentaire
Partager sur d’autres sites

Ben c'est facile :

* tu rajoutes un Vector<String> listOfAuthors;

* tu rajoutes un champ booléen addAuthor = false;

* dans ton startElement(), tu ajoute un if(simpleName.equalsIgnoreCase("author")) addAuthor = true;

* dans endElement(), tu rajoute un addAuthor = false;

* dans characters(), tu rajoute un if(addAuthor) listOfAthors.add(new String(ch, start, length));

Et vires les println(), si ton fichier fait vraiment 400Mio, alors ça va mettre plusieurs minutes au lieu de quelques secondes. :cartonrouge:

Merci beaucoup,

ça fonctionne parfaitement !!

Lien vers le commentaire
Partager sur d’autres sites

Petit détail toutefois, le Vector n'est pas vraiment justifié en environnoment mono-thread. ArrayList est + performant car non synchronisé.

Même en environnement multithread, Sun recommande plutôt d'utiliser Collections.synchronizedList, me semble-t-il... :byebye:

En fait, SAX est un parseur très basique qui se base sur une lecture séquentielle des données (ce qui fait qu'il est + rapide qu'une inspection DOM).

Ça m'étonnerait d'ailleurs même pas que DOM repose sur SAX pour le parsing du XML :cartonrouge:

Du coup, DOM est forcément plus lent que SAX, vu que DOM rajoute ensuite sa tambouille interne (construction de l'arbre...)

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...