Java et SAX parser xml

kungouf Messages postés 29 Date d'inscription lundi 3 mai 2004 Statut Membre Dernière intervention 15 février 2005 - 9 oct. 2004 à 17:02
cs_tds Messages postés 351 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 9 décembre 2004 - 29 nov. 2004 à 16:19
bonjour a tous

j'utilise le parser SAX en java pour recuperer des donnees provenant d'un fichier xml, et mon probleme est le suivant:

j'ai un plantage au moment de stocker les donnees dans un tableau de la methode si bien connu des habitue de java et sax:

public void characters (char buf [], int offset, int len){}

voici mon code:

public void startDocument () throws SAXException {
System.out.println("START DOCUMENT");
System.out.println("<?xml version='1.0' encoding='UTF-8'?>");
}

public void endDocument () throws SAXException {
System.out.println("END DOCUMENT");


for(int var=0; var < tableauPeres.size(); var++){

//debut nouveau rajout
JPanel lpanel = new JPanel(new GridLayout(1,1));

JLabel label = new JLabel("texte", SwingConstants.LEADING);
//JLabel label = new JLabel(listeFils[var], SwingConstants.LEADING);

label.setTransferHandler(new TransferHandler("text"));


//MouseListener listener = new DragMouseAdapter();
//label.addMouseListener(listener);



//affichage du titre
//System.out.println("nom"+nomTag);
TitledBorder t1 = BorderFactory.createTitledBorder((String) tableauPeres.get(var));

lpanel.add(label);
lpanel.setBorder(t1);
application.add(lpanel);
//fin nouveau rajout

var++;
}

if (indentLevel > 0) System.out.println("AIEEEE");

}

public void startElement (String name, AttributeList attrs)
throws SAXException {
tabs();


System.out.println("start element enclenche");
try{
if(name == "Name"){
i = 0;
}
else if(name == "ServiceRef"){
i = 1;
}
}
catch(Exception e){
System.err.println(e);
}

System.out.print("<" + name);
if (attrs != null) {
for (int i = 0; i < attrs.getLength (); i++) {
System.out.println();
tabs();
System.out.print(" ");
System.out.print(attrs.getName (i));
System.out.print(" = "");
System.out.print(attrs.getValue (i));
System.out.print(""");
}
}

if (attrs.getLength() > 0) { System.out.println(""); tabs(); }
System.out.println(">");
indentLevel++;
}

public void endElement (String name) throws SAXException {
indentLevel--;
tabs();
System.out.println("</" + name + ">");
}

public void characters (char buf [], int offset, int len)
throws SAXException {
String s = new String(buf, offset, len);


if (!s.trim().equals("")) {
System.out.println("characters enclenche ->semaphore: " + i);

if(i == 0){
tableauPeres.add(s);
}
else
tableauFils.add(s);

tabs();


System.out.println(s);
}
}

voila en gros ce qui se deroule dans mon programme:
1- parcours du fichier xml par le parser SAX
2- a chaque tag appel de la methode public void startElement() ->

si le tag s'appelle "Name" (name == "Name"), je met la valeur d'une variable i=0
sinon (si name == "ServiceRef") je met la valeur de la variable i=1

3- si le tag n'est pas vide (donc s'enclenche a chaque fois que je tombe sur un tag "Name" ou "ServiceRef" dans mon cas)

alors je stocke la donnee dans une collection en fonction du type de donnee dans la collection approprie:

if (!s.trim().equals("")) {
System.out.println("characters enclenche ->semaphore: " + i);
#0000ff
if(i == 0){
tableauPeres.add(s);
}
else
tableauFils.add(s);
/#0000ff
tabs();


System.out.println(s);
}

voila ca devrais fonctionner, seulement voila au moment de l'affectation des valeurs dans le tableau voila ce que j'ai en output:

START DOCUMENT
<?xml version='1.0' encoding='UTF-8'?>
#e2001c
java.lang.NullPointerException
at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:658)
at org.apache.crimson.parser.Parser2.parse(Parser2.java:333)
at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:448)
at org.xml.sax.helpers.XMLReaderAdapter.parse(XMLReaderAdapter.java:223)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:314)
/#e2001c
start element enclenche
<Services
xmlns = "http://www.hp.com/OV/opcsvc"
>
start element enclenche
<Service>
start element enclenche
<Label>
</Label>
start element enclenche


start element enclenche
<Name>
characters enclenche ->semaphore: 0
saga
</Name>
start element enclenche
<Source>
start element enclenche
<Composition>
</Composition>
start element enclenche
<ServiceRef>
characters enclenche ->semaphore: 1
#e2001c
at javax.xml.parsers.SAXParser.parse(SAXParser.java:253)
at SimpleSaxXml.(SimpleSaxXml.java:44)
at LabelDnD.(LabelDnD.java:102)
at LabelDnD.createAndShowGUI(LabelDnD.java:156)
at LabelDnD.access$0(LabelDnD.java:147)
at LabelDnD$1.run(LabelDnD.java:233)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:454)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
/#e2001c

quelqu'un sait d'ou l'erreur pourrait provenir?

2 réponses

PijanaKrava Messages postés 26 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 23 décembre 2004
10 oct. 2004 à 14:09
ben t'as fait LA grosse erreur à pas faire avec les String : utiliser == pour comparer 2 chaînes.
Le == teste si les 2 objets ont la même référence (adresse en mémoire).
Pour comparer les valeurs faut utiliser la méthode equals ! Ce qui est bizarre c'est que dans la méthode characters tu utilise equals alors je vois pas pourquoi dans startElement c'est == !
Grosse étourderie répétée par 2 fois !!

rhalala pas sérieux tout ça ..... :p je déconne ça peut arriver à tout le monde ;)
0
cs_tds Messages postés 351 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 9 décembre 2004
29 nov. 2004 à 16:19
Si tu veux vraiment comparer 2 String avec == alors tu dois reférencer tes String dans le String Pooler grâce à la méthode intern() de la Classe String à creuser pour les curieux :)
B@ron {EU.BELGIUM}
0
Rejoignez-nous
A voir également