2015-04-20 3 views
0

Je passe dans un fichier XML et un gestionnaire à l'SAXParser mais je reçois cette erreur: Cannot resolve method 'parse(java.io.File, jdk.internal.org.xml.sax.helpers.DefaultHandler)'Impossible d'analyser le fichier et gestionnaire dans SAXParser

Les attributs de la méthode d'analyse sont définis comme (File, DefaultHandler) qui correspondent exactement, donc je ne suis pas sûr d'où je vais mal. Voici la méthode complète:

public String readXML (File readFile) throws Exception { 
    SAXParserFactory saxFactory = SAXParserFactory.newInstance(); 
    SAXParser saxParser = saxFactory.newSAXParser(); 
    final String outputString = ""; 
    DefaultHandler handler = new DefaultHandler() { 
     boolean bArtist = false; 
     boolean bAlbumName = false; 
     boolean bYear  = false; 
     boolean bGenre  = false; 

     public void startElement(String uri, String localName, String qName, Attributes attr) 
       throws SAXException { 
      if (qName.equalsIgnoreCase("ARTIST")) { bArtist = true; } 
      if (qName.equalsIgnoreCase("ALBUMNAME")) { bAlbumName = true; } 
      if (qName.equalsIgnoreCase("YEAR"))  { bYear = true; } 
      if (qName.equalsIgnoreCase("GENRE"))  { bGenre = true; } 
     } 
     public void characters(char ch[], int start, int length) { 
      if (bArtist) { 
       outputString.concat("Artist: " + new String(ch,start,length) + "\n"); 
      } 
      if(bAlbumName) { 
       outputString.concat("Album: " + new String(ch,start,length) + "\n"); 
      } 
      if(bYear) { 
       outputString.concat("Year: " + new String(ch,start,length) + "\n"); 
      } 
      if(bGenre) { 
       outputString.concat("Genre: " + new String(ch,start,length) + "\n"); 
      } 
      outputString.concat("\n"); 
     } 
    }; 

    saxParser.parse(readFile,handler); 
    return outputString; 
} 

Répondre

1

Il devrait être org.xml.sax.helpers.DefaultHandler pas jdk.internal...

si

import org.xml.sax.helpers.DefaultHandler; 

Vous devriez probablement aussi définir la classe qui étend la DefaultHandler pas inline juste.

+0

Pourquoi serait-il préférable de le définir plutôt que de l'intégrer? – admrply

+1

juste une meilleure pratique. En tant que classe interne, il contient la référence à la classe contenant, fuite de mémoire potentielle. – Zielu

+0

Comment est-ce que je changerais pour être une classe plutôt qu'inline? Serait-ce juste un cas de créer une nouvelle sous-classe commençant par quelque chose comme 'private Handler() extends DefaultHandler {...}'? – admrply