Pour commencer à apprendre à utiliser le Saxparser, j'ai un très petit fichier XML que je veux analyser. mon fichier XML:Java SaxParser obtient une valeur nulle, tag non trouvé
modifier: (note: chaque entrée aura une carte d'identité pour l'identification mon objectif à la fin wil soit de pouvoir analyser un fichier xml plus complexe ayant chacun un id.)
<entry id="2000" >
<word>"hello"</word>
</entry>
maintenant, je crée une classe d'entrée:
public class Entry {
private int id;
private String word;
public int getID() {
return id;
}
public void setID(int id) {
this.id = id;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
@Override
public String toString() {
return "Entry:: ID="+this.id+" word=" + this.word;
}
}
mon étendue gestionnaire par défaut:
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.util.ArrayList;
import java.util.List;
public class MyHandler extends DefaultHandler {
private List<Entry> wordList = null;
private Entry word = null;
public List<Entry> getwordList() {
return wordList;
}
boolean bword = false;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("entry")) {
String id = attributes.getValue("id");
word = new Entry();
word.setID(Integer.parseInt(id));
if (wordList == null) {
wordList = new ArrayList<>();
} else if (qName.equalsIgnoreCase("word")) {
bword = true;
}
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("entry")) {
wordList.add(word);
}
}
@Override
public void characters(char ch[], int start, int length) throws SAXException {
if (bword) {
word.setWord(new String(ch, start, length));
bword = false;
}
}
}
et enfin je lance ici:
import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class Main {
public static void main(String[] args) {
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
try {
SAXParser saxParser = saxParserFactory.newSAXParser();
MyHandler handler = new MyHandler();
saxParser.parse(new File("/home/user/Desktop/test.xml"), handler);
//get verb liste
List<Entry> wordList = handler.getwordList();
//print verb
for (Entry word : wordList)
System.out.print(word);
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
}
}
le résultat est le suivant:
Entry:: ID=2000 word=null
Je sais que le problème est quelque part dans startElement parce qu'il tournerai ma Bword comme fausse ou il ne marche pas reconnaître le tag . parce que si je mets les caractères méthode aussi vrai pour le cas (Bword) {etc., il me donne
Entry:: ID=2000 word=
au lieu de
Entry:: ID=2000 word=null
Ce code ne fonctionnerait pas du tout. Tous les éléments de votre fichier n'ont pas d'attribut "id" donc word.setID (Integer.parseInt (id)); 'devrait lancer NPE. – fukanchik
merci pour votre replay @fukanchik. mes éléments auraient tous des identifiants pour l'identification. Pour l'instant, je n'ai qu'un seul élément pour commencer à tester. Mais à la fin ce sera un fichier xml plus complexe à analyser avec chaque élément ayant un identifiant. – Soshiribo
'qName.equalsIgnoreCase (" eintrag ")' ajoute un nouveau mot à la liste. Comme il n'y a pas de 'eintrag's dans le xml, aucun mot n'est ajouté. Vous ne devriez voir aucune entrée imprimée du tout – fukanchik