2011-08-08 5 views
6

나는 아래와 같이 파일을 구문 분석하는 JDOM과 XPath를 사용하여 XML 파일을 구문 분석하는 과정이 있습니다구문 분석 잘못된/불완전한/잘못된 XML 파일

private static SAXBuilder builder   = null; 
private static Document  doc   = null; 
private static XPath  xpathInstance  = null; 

builder = new SAXBuilder(); 
Text list = null; 

try { 
    doc = builder.build(new StringReader(xmldocument)); 

} catch (JDOMException e) { 
      throw new Exception(e); 
} 



try { 
    xpathInstance = XPath.newInstance("//book[author='Neal Stephenson']/title/text()"); 
    list = (Text) xpathInstance.selectSingleNode(doc); 
} catch (JDOMException e) { 
    throw new Exception(e); 
} 

는 위의 잘 작동합니다. xpath 표현식은 특성 파일에 저장되어 언제든지 변경할 수 있습니다. 이제 xml 파일을 4000 바이트 청크로 보낼 레거시 시스템에서 오는 xml 파일을 더 처리해야합니다. 기존 처리는 4000 바이트의 청크를 읽고 각각의 청크를 데이터베이스의 하나의 행으로 저장하여 Oracle 데이터베이스에 저장합니다 (레거시 시스템을 변경하거나 데이터베이스의 행이 청크를 저장하는 처리가 문제가되지 않음) .

특정 xml 문서와 관련된 모든 행을 추출하고 병합 한 다음 위의 기존 처리 (xml 문서를 구문 분석)를 사용하여 완전한 유효한 XML 문서를 작성할 수 있습니다.

하지만 XML 문서에서 추출해야하는 데이터는 항상 처음 4000 바이트에 있습니다. 이 덩어리는 불완전하지만 필요한 모든 데이터를 포함하므로 유효한 XML 문서가 아닙니다. 나는 JDOM 빌더가 그것을 거부 할 것이므로 하나의 청크만을 파싱 할 수 없다.

올바른 XML 문서를 얻기 위해 모든 부분을 병합하지 않고 조작 된 XML 청크를 구문 분석 할 수 있는지 궁금합니다. 이렇게하면 청크가 사용 가능한지 확인하기 위해 데이터베이스로의 여러 번 이동하는 시간을 절약 할 수 있으며 처음 4000 바이트를 사용할 수있는 경우에만 100 개의 청크를 병합하지 않아도됩니다.

필자는 아마도 관련 데이터를 추출하기 위해 java의 문자열 함수를 사용할 수 있지만 파서 또는 xpath를 사용하여 가능하다고 알고 있습니다. 또는 XML 문서를 구문 분석하기 전에 XML 문서가 잘 구성된 문서라고 기대합니까?

답변

5

JSoup을 사용하여 유효하지 않은 XML을 구문 분석 할 수 있습니다. 정의에 따르면 XML은 올바른 형식이어야하며 그렇지 않으면 유효하지 않으므로 사용해서는 안됩니다.

UPDATE - 예 :

public static void main(String[] args) { 
    for (Node node : Parser.parseFragment("<test><author name=\"Vlad\"><book name=\"SO\"/>" , 
      new Element(Tag.valueOf("p"), ""), 
      "")) { 
     print(node, 0); 
    } 
} 

public static void print(Node node, int offset) { 
    for (int i = 0; i < offset; i++) { 
     System.out.print(" "); 
    } 
    System.out.print(node.nodeName()); 
    for (Attribute attribute: node.attributes()) { 
     System.out.print(", "); 
     System.out.print(attribute.getKey() + "=" + attribute.getValue()); 
    } 
    System.out.println(); 
    for (Node child : node.childNodes()) { 
     print(child, offset + 4); 
    } 
} 
+0

덕분에 -이 HTML 문서에 고유 한 생각합니다. HTML로 작업하지 않습니다. – ziggy

+0

@ziggy : parseFragment() 시도해주세요! 내 업데이트를 참조하십시오. – Vlad

+0

아하 흥미 롭군요. 제가 확인하겠습니다. 감사합니다 – ziggy