2011-08-07 2 views
1

저자 이름/제목/연도 등을 얻기 위해 java에서 dblp.xml을 구문 분석하려고하지만 파일이 거대 (860MB)이므로 DOM/SAX를 사용할 수 없습니다. 완전한 파일.자바 DOM/SAX를 사용하여 dblp.xml 구문 분석

그래서 파일을 각각 약 100MB 크기의 여러 개의 작은 파일로 분할했습니다.

지금 각 파일은 다음과 같이 다양한 (천) 노드를 포함

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

1백메가바이트는 DOM에서 읽을 수 있어야한다, 나는 가정입니다,하지만 코드는 이후 약 45K 라인을 중지합니다. 다음은 내가 사용하고있는 자바 코드입니다 :

@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를 사용해 보았습니다. 그러나 그 또한

+1

"코드 중단"의 의미를 정확하게 말하면 더 나은 답변을 얻을 수 있습니다. 'readConfigDOM()'이 반환합니까, 아니면 멈 춥니 까? 그것이 멈 추면, 어떤 라인이 멈추는가? (디버거에서 실행하거나 쓰레드 덤프를 얻을 수있다). – parsifal

+2

덧붙여서, SAX는 큰 파일에는 아무런 문제가 없습니다. – parsifal

답변

0

목표를 세우는 것만으로도 BufferedReader를 사용하여 파일을 텍스트 파일로 읽습니다. 원한다면 정규식을 던져라. MySQL을 사용하는 옵션 인 경우

, 당신은이 도움이 XML Functions

희망의를 통해이 무거운을 얻을 수 있습니다.

0

xml 형식에 대해 너무 성급하게 생각하지 마십시오. 그것은 어쨌든 대단히 유용하지 않습니다. 텍스트 파일로 읽고 문자열을 문자열로 구문 분석하십시오. 그런 다음 데이터를 CSV로 내보내고 그 지점에서 원하는 방식으로 사용할 수 있습니다. 불행히도 xml은 대용량 문서에서는 그리 효율적이지 않습니다. 연구 프로젝트에서 비슷한 것을 한 것 같습니다. http://qualityofdata.com/2011/03/27/dblp-for-sql-server/