2011-08-07 3 views
1

J'essaye d'analyser dblp.xml dans java pour obtenir les noms d'auteur/titre/année etc., mais comme le fichier est énorme (860MB), je ne peux pas utiliser DOM/SAX sur le fichier complet. J'ai donc divisé le fichier en plusieurs petits fichiers d'environ 100 Mo chacun.Analyse syntaxique dblp.xml avec java DOM/SAX

Maintenant, chaque fichier contient diverses (en milliers de) noeuds comme ceci:

<dblp> 
<inproceedings mdate="2011-06-23" key="conf/aime/BianchiD95"> 
<author>Nadia Bianchi</author> 
<author>Claudia Diamantini</author> 
<title>Integration of Neural Networks and Rule Based Systems in the Interpretation of Liver  Biopsy Images.</title> 
<pages>367-378</pages> 
<year>1995</year> 
<crossref>conf/aime/1995</crossref> 
<booktitle>AIME</booktitle> 
<url>db/conf/aime/aime1995.html#BianchiD95</url> 
<ee>http://dx.doi.org/10.1007/3-540-60025-6_152</ee> 
</inproceedings> 
</dblp> 

100MB doit être lisible dans DOM, je suppose, mais le code arrête après environ 45k lignes. Voici le code java que j'utilise:

@SuppressWarnings({"unchecked", "null"}) 
public List<dblpModel> readConfigDOM(String configFile) { 
    List<dblpModel> items = new ArrayList<dblpModel>(); 
    List<String> strList = null; 
    dblpModel item = null; 

    try { 

     File fXmlFile = new File(configFile); 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(fXmlFile); 
     doc.getDocumentElement().normalize(); 

     NodeList nList = doc.getElementsByTagName("incollection"); 

     for (int temp = 0; temp < nList.getLength(); temp++) { 
      item = new dblpModel(); 
      strList = new ArrayList<String>(); 
      Node nNode = nList.item(temp); 
      if (nNode.getNodeType() == Node.ELEMENT_NODE) { 

       Element eElement = (Element) nNode; 

       strList = getTagValueString("title", eElement); 
       System.out.println(strList.get(0).toString()); 

       strList = getTagValueString("author", eElement); 
       System.out.println("Author : " + strList.size()); 
       for(String s: strList) { 
        System.out.println(s); 

       } 
      } 
      items.add(item); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return items; 
} 


private static String getTagValueString(String sTag, Element eElement) { 
    String temp = ""; 
    StringBuffer concatTestSb = new StringBuffer(); 
    List<String> strList = new ArrayList<String>(); 
    int len = eElement.getElementsByTagName(sTag).getLength(); 

    try { 

     for (int i = 0; i < len; i++) { 
      NodeList nl = eElement.getElementsByTagName(sTag).item(i).getChildNodes(); 
      if (nl.getLength() > 1) { 
       for (int j = 0; j < nl.getLength(); j++) { 
        concatTestSb.append(nl.item(j).getTextContent()); 
       } 
      } else { 
       temp = nl.item(0).getNodeValue(); 
       concatTestSb.append(temp); 
       if (len > 1) { 
        concatTestSb.append("*"); 
       } 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return concatTestSb.toString(); 
} 

Une aide? J'ai essayé d'utiliser aussi STAX api pour l'analyse des documents volumineux, mais aussi

+1

Vous obtiendrez de meilleures réponses si vous dites exactement ce que "le code s'arrête" signifie. Est-ce que 'readConfigDOM()' renvoie, ou est-ce qu'il se bloque? Si elle se bloque, à quelle ligne se bloque-t-elle (vous pouvez exécuter sous un débogueur et/ou obtenir un vidage de thread). – parsifal

+2

Incidemment, SAX n'aurait aucun problème avec un gros fichier. – parsifal

Répondre

0

Si vous souhaitez simplement obtenir les détails, utilisez simplement BufferedReader pour lire le fichier sous forme de fichier texte. Si vous voulez, ajoutez un peu d'expression régulière.

si vous utilisez MySQL est une option, vous pouvez être en mesure de l'obtenir pour faire le levage de charges lourdes à travers ses XML Functions

Hope this helps.

0

Ne vous en faites pas trop à propos du format xml. Ce n'est pas très utile de toute façon. Il suffit de le lire en tant que fichier texte et d'analyser les lignes en tant que chaîne. Vous pouvez ensuite exporter les données dans un fichier csv et l'utiliser comme vous le souhaitez. Malheureusement, le format xml n'est pas très efficace pour les documents volumineux. J'ai fait quelque chose de similaire ici pour un projet de recherche: http://qualityofdata.com/2011/03/27/dblp-for-sql-server/