Разбор dblp.xml с помощью Java DOM / SAX - PullRequest
1 голос
/ 07 августа 2011

Я пытаюсь проанализировать dblp.xml в java, чтобы получить имена авторов / название / год и т. Д., Но так как файл огромен (860 МБ), я не могу использовать DOM / SAX для всего файла.

Итак, я разделил файл на несколько маленьких файлов размером около 100 МБ каждый.

Теперь каждый файл содержит различные (тысячи) узлов, например:

<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>

100 МБ должно быть читаемым в DOM, я полагаю, но код останавливается после примерно 45k строк. Вот код Java, который я использую:

@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();
}

Любая помощь? Я пытался использовать STAX API для анализа больших документов, но это также

Ответы [ 2 ]

0 голосов
/ 01 сентября 2011

Не суетитесь слишком много о формате xml. Это не очень полезно в любом случае. Просто прочитайте его как текстовый файл и проанализируйте строки как строку. Затем вы можете экспортировать данные в CSV и использовать их так, как вы хотите с этого момента. К сожалению, XML не очень эффективен для больших документов. Я сделал нечто подобное здесь для исследовательского проекта: http://qualityofdata.com/2011/03/27/dblp-for-sql-server/

0 голосов
/ 07 августа 2011

Если вы хотите просто узнать подробности, просто используйте BufferedReader, чтобы прочитать файл как текстовый файл.Если вы хотите, добавьте некоторое регулярное выражение.

, если опция mysql является опцией, вы можете получить ее, чтобы выполнять тяжелую работу через функции XML

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...