2014-06-06 12 views
2

내 XML 파일의 <page> 태그 내에 텍스트를 캡처해야합니다. 전체 텍스트, 다른 태그, 속성 등. 예를 들어 정규 표현식을 사용하여이 작업을 수행 할 수 있지만이 작업이 안전해야 SAXParser를 사용하고 싶습니다.SAXParser에서 부분 XML 코드를 캡처하는 방법

하지만 SAXParser에서 ContentHandler가 수신 할 수있는 모든 정보가 충분하지 않아 XML 태그의 시작 부분에서 커서 위치가 많이 도움이 될 것 같습니다.

다른 안전한 방법이 있습니까?

<page> 내의 텍스트 대신 DOM 트리가 될 수 있지만, 성능을 위해서는 우선적으로 선호합니다.

+0

그럼 어떻게 그 텍스트를 반환 하시겠습니까? String 객체처럼? –

+0

Jeah. ' '요소 중 일부에 대해 DOM 트리를 작성하고 싶습니다. 그러나 모든 사람들을 위해이 작업을 수행하지 않으려합니다. 비록 작동한다면 아무것도없는 것보다 낫습니다. –

+0

좋아요,''태그와 그 내용을 문자열로 받아들이는 것은 DOM이 있다는 것을 의미하지는 않지만 예제를 함께 작성하고 답변을 작성해 드리겠습니다. –

답변

2

좋아, 내가 먼저 할 일은 사용자 정의 DefaultHandler을 다음과 같이 작성하는 것입니다.

public class PrintXMLwithSAX extends DefaultHandler { 

    private int embedded = -1; 
    private StringBuilder sb = new StringBuilder(); 
    private final ArrayList<String> pages = new ArrayList<String>();  


    @Override 
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 
     if(qName.equals("page")){ 
      embedded++; 
     } 
     if(embedded >= 0) sb.append("<"+qName+">"); 
    } 

    @Override 
    public void characters(char[] ch, int start, int length) throws SAXException { 
     if(embedded >= 0) sb.append(new String(ch, start, length)); 
    } 

    @Override 
    public void endElement(String uri, String localName, String qName) throws SAXException { 
     if(embedded >= 0) sb.append("</"+qName+">"); 
     if(qName.equals("page")) embedded--; 
     if(embedded == -1){ 
      pages.add(sb.toString()); 
      sb = new StringBuilder(); 
     } 
    } 

    public ArrayList<String> getPages(){ 
     return pages; 
    } 

} 

DefaultHandler (구문 분석시) 각 요소를 통해 실행 및 startElement(), characters(), endElement()과 몇 가지 다른를 호출합니다. 위 코드는 startElement()의 요소가 <page> 요소인지 확인합니다. 034보다 큰 경우 embedded을 1 씩 증가시킵니다. 그 후에 각 메소드는 embedded이> = 0인지 확인합니다. 허용되는 경우 각 요소 내부의 문자와 태그 (이 특정 예에서는 속성 제외)를 StringBuilder에 추가합니다 목적. endElement()</page> 요소의 끝을 찾으면 embedded을 감소시킵니다. 임베디드가 -1로 떨어지면 더 이상 일련의 페이지 요소에 포함되지 않으므로 StringBuilder의 결과를 ArrayList pages에 추가하고 StringBuilder을 새로 시작하여 다른 <page> 요소를 기다립니다.

그런 다음 핸들러를 실행 한 다음 <page> 요소가 포함 된 문자열 ArrayList을 검색해야합니다.

SAXParserFactory factory = SAXParserFactory.newInstance(); 
    SAXParser saxParser = factory.newSAXParser(); 
    PrintXMLwithSAX handler = new PrintXMLwithSAX(); 
    InputStream input = new FileInputStream("C:\\Users\\me\\Desktop\\xml.xml"); 
    saxParser.parse(input, handler); 
    ArrayList<String> myPageElements = handler.getPages(); 

지금 myPageElements 문자열 모든 페이지 요소 및 내용을 포함하는 ArrayList입니다.

이 정보가 도움이되기를 바랍니다.

+0

'characters()'메소드가 (no xml 텍스트 만 제공하기 때문에) 도움이되지 않을 것이라고 확신했습니다. 이 방법이 작동하는지 확인한 다음 답변을 수락합니다. 감사합니다! –

+0

@ KrzysztofStanisławek - 실수를 발견하고 답변을 업데이트했습니다. 'characters()'메소드를 업데이트하여 XML의 텍스트 전체를 대신에 올바른 텍스트를 반환했습니다. :) –

+1

나는 이미 받아 들였지만,'wholePage = wholePage.substring (0, wholePage.indexOf (""));'와 함께 문제를 봅니다. ''이 텍스트의 일부인 경우 어떻게해야합니까? 이 문자열이 발생할 때마다 태그가 닫히는 것을 의미 할 수 있습니까? 그러나 char [] ch가 전체 문서의 문자 배열 일 때 문제는 해결하기가 쉽습니다. endElement()를 사용할 수 있습니다. 필자는 이전에'문자 (...) '문서를 읽어야합니다. 감사! –