2017-09-01 64 views
0

我試圖從GraphML文件中提取數據。文件鏈接:https://www.dropbox.com/s/mp5x7ykqabmpzsg/EXEMPLE%202.graphml?dl=0SAX解析器返回主類中的空列表

這裏是我的默認處理類:

公共類MLAnalyser從這個類中的三個列表的大小是正確的擴展了DefaultHandler {

public List<List<String>> elementsAttributes = new ArrayList<List<String>>(); 
List<Integer> index_node= new ArrayList<Integer>(); 
List<Integer> target_edge= new ArrayList<Integer>(); 
List<Integer> source_edge= new ArrayList<Integer>(); 

public void startElement(String namespaceURI, String sName, String qName, Attributes attrs) throws SAXException { 
    String eName = sName; 
    if ("".equals(eName)) 
     eName = qName; 
if (eName == "node") { 

    if (attrs != null) { 
     for (int i = 0; i < attrs.getLength(); i++) { 
      String aName = attrs.getLocalName(i); 
      if ("".equals(aName)) { 
      aName = attrs.getQName(i); 
      } 
      System.out.println(" " + aName + "=" + attrs.getValue(i) +"") ; 
      if (aName == "id") { 
       int x = Integer.parseInt(attrs.getValue(i)); 
       index_node.add(x); 
      }  
     } 
    } 
} 
else if (eName == "edge") { 

    if (attrs != null) { 
     //Attributes listing 
     for (int i = 0; i < attrs.getLength(); i++) { 
      String aName = attrs.getLocalName(i); 
      if ("".equals(aName)) { 
       aName = attrs.getQName(i); 
      } 
      System.out.println(attrs.getValue(i)) ; 
      if (aName == "source") 
      { 
       int x = Integer.parseInt(attrs.getValue(i)); 
       source_edge.add(x); 
      } 
      else if (aName == "target") 
      { 
       int x = Integer.parseInt(attrs.getValue(i)); 
       target_edge.add(x); 
      }   

     } 
    } 
} 
System.out.println(index_node.size() + " " + source_edge.size() + " " + target_edge.size()) ; 

}

,但在創建MLAnalyser對象並打印列表大小的主類中,它們是空的。

公共類GraphML_Parser {

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    MLAnalyser a = new MLAnalyser() ; 

     try{ 

      SAXParserFactory fabrique = SAXParserFactory.newInstance(); 
      SAXParser parseur = fabrique.newSAXParser(); 
      System.out.println(a.index_node.size()); 
      File myfile = new File("D:/EXEMPLE 2.graphml"); 

      DefaultHandler gestionnaire = new MLAnalyser(); 

      parseur.parse(myfile, gestionnaire); 

      for(int i=0; i<a.index_node.size(); i++) 
      { 
       System.out.println("node "+ i + ":"); 
       System.out.println(a.index_node.get(i)); 
      } 
      //GrapheMatrix mat = new GrapheMatrix(a.nodeNum,a.arcNum); 
      //a.create_matrix(); 
     } 

     catch(ParserConfigurationException pce){ 
      System.out.println("Erreur de configuration du parseur"); 
      System.out.println("Lors de l'appel à newSAXParser()"); 
     }catch(SAXException se){ 
      System.out.println("Erreur de parsing"); 
      System.out.println("Lors de l'appel à parse()"); 
     }catch(IOException ioe){ 
      System.out.println("Erreur d'entrée/sortie"); 
      System.out.println("Lors de l'appel à parse()"); 
     } 
} 

}

+0

這是一個小文件,你爲什麼要用薩克斯? –

+0

@ vtd-xml-author只是做了這個工作,並且很容易實現代碼。 – Khaled

回答

0

的解決方案是所謂的 「公共無效調用endDocument()」,並在其編寫代碼。