2010-07-14 3 views
1

J'écris un fichier qui peut analyser les fichiers rdf et owl. J'utilise SAX et Java.Vous ne pouvez pas ajouter une valeur à ArrayList, car il est dans une classe interne?

Mon problème est sur la ligne activeObject.add(file);

Je reçois l'erreur « Erreur de syntaxe sur des jetons, construction Misplaced (s) » - Je ne sais pas ce que cela signifie. Et cela ne semble pas logique, toute aide serait grandement appréciée. PS: Je me suis peut-être complètement trompé sur ce qui cause l'erreur, cela n'a peut-être rien à voir avec une classe interne.

public static void main(String args[]) throws URISyntaxException, MalformedURLException, IOException { 

    // String file = 
    // "http://www.srdc.metu.edu.tr/ubl/contextOntology/cpc.owl"; 
    // final String file = "http://onto.eva.mpg.de/obo/image.owl"; 
    // final String file = 
    // "http://www.informatik.uni-ulm.de/ki/Liebig/owl/SUMO-LiteTB.rdf"; 
    // final String file = 
    // "http://www.csd.abdn.ac.uk/~apreece/research/TowardsAnIntelligentWeb/PUB_findallbyKen_result.rdf"; 
    // final String file = 
    // "http://www.srdc.metu.edu.tr/ubl/contextOntology/naics.owl"; 
    final String file = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; 

    URI uri = new URI(file); 
    InputStream is = uri.toURL().openStream(); 

    try { 
     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     SAXParser saxParser = factory.newSAXParser(); 

     DefaultHandler handler = new DefaultHandler() { 

      ArrayList<String> activeProperty = new ArrayList<String>(); 
      ArrayList<Triple> triplesList = new ArrayList<Triple>(); 
      ArrayList<String> activeObject = new ArrayList<String>(); 

      boolean name = false; 
      activeObject.add(file); 

      public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException { 

       activeProperty.add(qName); 
       int attrLength = attributes.getLength(); 

       for (int i = 0; i < attrLength; i++) { 
        String attrName = attributes.getQName(i).toLowerCase(); 
        String attrValue = attributes.getValue(i).toLowerCase(); 

        if (attrName.equals("rdf:about") || attrName.equals("rdf:resource") || attrName.equals("rdf:id")) { 
         activeObject.add(attrValue); 
System.out.println(activeObject); 
         } 

        else{ 
         String subject = activeObject.get(activeObject.size()-1); 
         String predicate = attrName; 
         String object = attrValue; 
         Triple newTriple = new Triple(subject, predicate, object);   
         } 
        } 
       } 

      public void characters(char[] ch, int start, int length) throws SAXException { 
//      tempVal = new String(ch, start, length); 
      } 

      public void endElement(String uri, String localName, String rawName) { 

       String subject = activeObject.get(activeObject.size()-2); 
       String predicate = activeProperty.get(activeProperty.size()-1); 
       String object = activeObject.get(activeObject.size()-1); 

       Triple newTriple = new Triple(subject,predicate, object); 

       if (rawName.equals(activeProperty.get(activeProperty.size() - 1))) { 
        activeProperty.remove(activeProperty.size() - 1); 
       } 
       else{ 
        System.out.println("Something is seriosuly wrong ...sdf.sdf.we8ryw98fsydh"); 
       } 
//     System.out.println(activeProperty); 
      } 

      // if (qName.equalsIgnoreCase("NAME")) { 
      // name = true; 
      // } 

      // public void characters(char ch[], int start, int length) 
      // throws SAXException { 
      // if (name) { 
      // System.out.println("Name: " 
      // + new String(ch, start, length)); 
      // name = false; 
      // } 
      // } 
     }; 

     saxParser.parse(is, handler); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Répondre

3

Vous essayez d'écrire des déclarations normales au sein d'une classe anonyme, comme si vous aviez essayé ceci:

class Foo extends DefaultHandler { 
    ArrayList<String> activeProperty = new ArrayList<String>(); 
    ArrayList<Triple> triplesList = new ArrayList<Triple>(); 
    ArrayList<String> activeObject = new ArrayList<String>(); 

    boolean name = false; 
    activeObject.add(file); 
} 

Vous ne pouvez pas faire cela. Si vous voulez que cela soit effectué sur la construction, vous pouvez le mettre dans un bloc initialiseur, comme ceci:

ArrayList<String> activeProperty = new ArrayList<String>(); 
ArrayList<Triple> triplesList = new ArrayList<Triple>(); 
ArrayList<String> activeObject = new ArrayList<String>(); 
boolean name = false; 

{ 
    activeObject.add(file); 
} 

Ou vous pouvez remplir la liste d'une autre façon, peut-être - par exemple avec Guava vous pouvez écrire:

ArrayList<String> activeObject = Lists.newArrayList(file); 
+0

Merci Jon, le bloc d'initialisation travaillé. Maintenant, j'ai juste besoin de regarder ce que c'est et ce qu'il fait. Merci. – Ankur

Questions connexes