b

VTD-XML 을 이용한 XML 분리. 본문

spring framework

VTD-XML 을 이용한 XML 분리.

dev.bistro 2014. 2. 14. 22:01


http://bistros.tistory.com/entry/JAXP-DOM4J-JDOM2%EC%9D%98-%EC%84%B1%EB%8A%A5-%EB%B9%84%EA%B5%90 이 글이나 http://vtd-xml.sourceforge.net/userGuide/5.html 이 글을 보면, 딱히 VTD-XML을 이용하는 이유를 설명안해도 될것같다.


1개의 거대한  XML Documet를 특정 XPATH로 분리하여 처리할 이슈가 있었다. 처음에는 STAX을 이용하여 Current Node를 계속 포인팅해가면서 StringBuiler에 기록해나가는 방식이었는데.. 아래처럼 쓰기로 결정하였다. (VTD의 라이브러리를 확실히 파악하지 못해서 개선할 여지는 충분할 것이라 생각한다)


대략적인 기능: 

ROOT NODE - 예) /documents/document

ID NODE  - 예) /documents/document/id

2개의 XPATH정보로부터  <ID, XML Document의 String> 형태로 얻어냄


    @Override
    public HeusoRawDocument getNext() throws VTDException {
        HeusoRawDocument rawDocument=null;
        String content=null, docId=null;

        try {
            int rootTagPoint= rootAutoPilot.evalXPath();
            if(rootTagPoint != -1){
                long elementFragment = docVN.getElementFragment();
                int startPoint = (int)elementFragment;
                int pointLength= (int)(elementFragment >> 32);
                content =  docVN.toRawString(startPoint, pointLength);

                int docIdTagPoint = docIdAutoPilot.evalXPath();
                if(docIdTagPoint != -1){
                    docId = docVN.getXPathStringVal();
                }
            }
        } catch (VTDException vtde){
            logger.error("VTD-XML 파서가 파일에서 1개씩 읽어오는 동안 오류가 발생하였습니다. 대략적인 위치는 인덱스 : {} ", count);
            throw vtde;
        }

        if ( content != null && docId != null ){
            String fixedLengthDocId = StringUtils.leftPad(docId, DOCUMENT_ID_LENGTH);
            rawDocument = new HeusoRawDocument(collId, fixedLengthDocId, content);
            count++;
        }
        return rawDocument; 

}


Comments