2016-09-13 2 views
0

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 
+0

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

+0

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

+0

'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

Répondre

0

Merci à @fukanchic qui a expliqué et a souligné l'erreur: les accolades ont été mal réglés

ici MyHandler corrigée partie.

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; 
    } 
    } 

} 
0

dans la classe MyHandler vous avez un « Allemand »? mot ...

if (qName.equalsIgnoreCase("eintrag")) { 

il doit être entrée Je suppose que

et l'exception est parce que

vous ne vérifiez que tous les éléments de l'enfant n'a pas d'attribut id ... comme l'élément mot ...

donc ici:

String id = attributes.getValue("id"); 
    word = new Entry(); 

     word.setID(Integer.parseInt(id)); 

id est nul et vous essayez pour analyser int NULL qui est en train d'exploser le code ...

+0

Je suis désolé que c'était mon erreur. il devrait être l'entrée et pas eintrag. avec l'entrée au lieu de eintrag il me donnera le résultat mentionné ci-dessus avec word = null – Soshiribo

+0

ok ... laissez-moi vérifier pourquoi –