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
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
Incidemment, SAX n'aurait aucun problème avec un gros fichier. – parsifal