저자 이름/제목/연도 등을 얻기 위해 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를 사용해 보았습니다. 그러나 그 또한
"코드 중단"의 의미를 정확하게 말하면 더 나은 답변을 얻을 수 있습니다. 'readConfigDOM()'이 반환합니까, 아니면 멈 춥니 까? 그것이 멈 추면, 어떤 라인이 멈추는가? (디버거에서 실행하거나 쓰레드 덤프를 얻을 수있다). – parsifal
덧붙여서, SAX는 큰 파일에는 아무런 문제가 없습니다. – parsifal