KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > zirc > xml > XmlPars


1 package zirc.xml ;
2
3 //import utile au parsage xml
4
import java.util.* ;
5 import org.xml.sax.* ;
6
7 //zIrc, irc client.
8
// Copyright (C) 2004 CoolBytes(Stephane claret, Andre Aymon, Alban Zumofen) coolbytes@hotmail.com
9
//
10
// This program is free software; you can redistribute it and/or
11
// modify it under the terms of the GNU General Public License
12
// as published by the Free Software Foundation; either version 2
13
// of the License, or (at your option) any later version.
14
//
15
// This program is distributed in the hope that it will be useful,
16
// but WITHOUT ANY WARRANTY; without even the implied warranty of
17
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
// GNU General Public License for more details.
19

20 /**
21  * <p>Title:XmlPars deprecie... </p>
22  * <p>Description: </p>
23  * <p>Copyright: Copyright (c) 2004</p>
24  * <p>Company: CoolBytes(Stephane claret, Andre Aymon, Alban Zumofen) coolbytes@hotmail.com</p>
25  * @version 1.0
26  */

27
28
29 //Description : le parseur xml resoit un tableau de cléf et retourne une
30
// une arrayListe de valeur
31
//le parseur : C'est un modèle de lecture pour un type de fichier xml
32
//sax : J'utilise sax, c'est l'api qui permet de lire du xml par évènements
33
// C'est le début du docuemnt alors je fait cela, etc
34
//rem : pour de plus emplerenseignement voir en fin de class, texte + lien
35

36 public class XmlPars extends HandlerBase
37 {
38   private String JavaDoc tag = "" ;
39   private ArrayList aList = new ArrayList() ;
40   private String JavaDoc[] ligne ;
41   private String JavaDoc[] clefs ;
42
43   //n'est pas utilisé
44
public XmlPars()
45   {
46   }
47
48   //constructeur par paramètre (tableau de cléf)
49
public XmlPars(String JavaDoc[] _clefs)
50   {
51     //fait une copie de _clefs (c'est certainement un prob de pointeur)
52
clefs = new String JavaDoc[_clefs.length] ;
53     for (int i = 0 ; i < _clefs.length ; i++)
54     {
55       clefs[i] = new String JavaDoc(_clefs[i]) ;
56     }
57     ligne = new String JavaDoc[_clefs.length] ;
58   }
59
60   //lis les tags
61
public void startElement(String JavaDoc name, org.xml.sax.AttributeList JavaDoc atts)
62   {
63     tag = name ;
64   }
65
66   //inserrer la ligne dans l'arrayList
67
public void endElement(String JavaDoc name)
68   {
69
70     //si c'est la dernière clefs alors enregistrer la ligne
71
if (name.equals(clefs[clefs.length - 1]))
72     {
73       //faire une copie de ligne[] (je pense qu'il y a un prob de pointeur)
74
String JavaDoc[] newLigne = new String JavaDoc[ligne.length] ;
75       for (int i = 0 ; i < newLigne.length ; i++)
76       {
77         newLigne[i] = ligne[i] ;
78       }
79       //ajouter la ligne copiée
80
aList.add(newLigne) ;
81     }
82     tag = "" ;
83   }
84
85   //Actions à réaliser sur les données
86
public void characters(char[] caracteres, int debut, int longueur)
87   {
88     if (!tag.equals(""))
89     {
90       String JavaDoc donnees = new String JavaDoc(caracteres, debut, longueur) ;
91       //System.out.println(" "+tag+" = *" + donnees + "*") ;
92

93       //mettre les données dans la ligne au bon endroit
94
for (int i = 0 ; i < clefs.length ; i++)
95       {
96         if (tag.equals(clefs[i]))
97         {
98           ligne[i] = new String JavaDoc(donnees) ;
99         }
100       }
101     }
102   }
103
104   public ArrayList getAList()
105   {
106     return aList ;
107   }
108   public void aListClear()
109   {
110   aList.clear();
111   }
112   //methode pas utilisées
113
public void startDocument()
114   {
115   }
116
117   public void endDocument()
118   {
119   }
120
121 }
122 /** http://perso.wanadoo.fr/jm.doudoux/java/tutorial/chap031.htm
123  *Conseil de traitement XML
124  *
125  La classe handler doit redéfinir certaines de ces méthodes selon les besoins des traitements.
126  En règle générale :
127  * il faut sauvegarder dans une variable le tag courant dans la méthode startElement()
128  * traiter les données en fonction du tag courant dans la méthode characters()
129  La sauvegarde du tag courant est obligatoire car la méthode characters() ne contient pas dans ces paramètres le nom du tag correspondant aux données.
130  Si les données contenues dans le document XML contiennent plusieurs occurrences qu'il faut gérer avec une collection qui contiendra des objets encapsulant les données, il faut :
131  * gérer la création d'un objet dans la méthode startElement() lors de la rencontre du tag de début d'un nouvel élément de la liste
132  * alimenter les attributs de l'objet avec les données de chaque tags utiles dans la méthode characters()
133  * gérer l'ajout de l'objet à la collection dans la méthode endElement() lors de la rencontre du tag de fin d'élément de la liste
134  La méthode characters() est appelée lors de la détection de données entre un tag de début et un tag de fin mais aussi entre un tag de fin et le tag début suivant lorsqu'il y a des caractères entre les deux. Ces caractères ne sont pas des données mais des espaces, des tabulations, des retour chariots et certains caractères non visibles.
135  Pour éviter de traiter les données de ces événements, il y a plusieurs solutions :
136  * supprimer tous les caractères entre les tags : tous les tags et les données sont rassemblés sur une seule et unique ligne. L'inconvénient de cette méthode est que le message est difficilement lisible par un être humain.
137  * une autre méthode consiste à remettre à vide la donnée qui contient le tag courant (alimentée dans la méthode startElement()) dans la méthode endElement(). Il suffit alors d'effectuer les traitements dans la méthode characters() uniquement si le tag courant est différent de vide
138  */

139
Popular Tags