Java에는 XML 문서를 기본적으로 구문 분석하는 두 가지 방법, 즉 Dom 구문 분석과 Sax 구문 분석이 있습니다.
Dom 구문 분석 기능은 강력하며 작업 중에 xml 문서를 문서 객체 형태로 메모리에 읽어 들이기 때문에 작은 문서에 적합합니다.
Sax 파싱은 내용을 한 줄씩, 요소별로 처음부터 끝까지 읽는 방식으로 수정이 더 불편하지만 대용량 읽기 전용 문서에 적합합니다.
이 글에서는 주로 Sax 파싱에 대해 설명하고 나머지는 나중에 다루겠습니다.
Sax는 이벤트 기반 접근 방식을 사용하여 문서를 구문 분석합니다. 쉽게 말하면 영화관에서 영화를 보는 것과 같습니다. 돌아가지 않고 처음부터 끝까지 볼 수 있습니다. (돔은 앞뒤로 읽을 수 있습니다.)
영화를 보는 과정에서 줄거리나 눈물, 어깨를 맞대고 마주칠 때마다 뇌와 신경을 동원해 이 정보를 받아들이거나 처리하게 된다.
마찬가지로 Sax의 구문 분석 프로세스 중에 문서의 시작과 끝, 요소의 시작과 끝을 읽으면 이러한 콜백 메서드에서 해당 이벤트 처리를 수행할 수 있습니다.
네 가지 메소드는 다음과 같습니다: startDocument(), endDocument(), startElement(), endElement
또한, 노드를 읽는 것만으로는 충분하지 않습니다. 요소에 포함된 내용을 주의 깊게 처리하려면 문자() 메서드도 필요합니다.
이러한 콜백 메서드를 수집하면 필요한 트리거인 클래스가 형성됩니다.
일반적으로 Main 메서드에서 문서를 읽지만, 트리거에서 문서를 처리하는 것이 소위 이벤트 기반 구문 분석 방법입니다.
위에 표시된 것처럼 트리거에서는 먼저 문서 읽기를 시작한 다음 요소를 하나씩 구문 분석하기 시작합니다. 각 요소의 내용은 문자() 메서드에 반환됩니다.
그런 다음 요소 읽기를 종료합니다. 모든 요소를 읽은 후 문서 구문 분석을 종료합니다.
이제 트리거 클래스를 생성하기 시작합니다. 이 클래스를 생성하려면 먼저 DefaultHandler를 상속해야 합니다.
SaxHandler를 생성하고 해당 메서드를 재정의합니다.
공용 클래스 SaxHandler는 DefaultHandler를 확장합니다.
/* 이 메소드에는 세 개의 매개변수가 있습니다.
arg0은 요소 내용을 포함하는 반환된 문자 배열입니다.
arg1과 arg2는 각각 배열의 시작 위치와 끝 위치입니다*/
@보수
공개 무효 문자(char[] arg0, int arg1, int arg2)는 SAXException을 발생시킵니다.
문자열 내용 = new String(arg0, arg1, arg2);
System.out.println(content);
super.characters(arg0, arg1, arg2);
}
@보수
public void endDocument()에서 SAXException이 발생합니다.
System.out.println("/n...문서 분석 종료...");
super.endDocument();
}
/* arg0은 네임스페이스입니다.
arg1은 네임스페이스를 포함하는 레이블이거나 네임스페이스가 없으면 비어 있습니다.
arg2는 네임스페이스가 없는 레이블입니다*/
@보수
공개 무효 endElement(문자열 arg0, 문자열 arg1, 문자열 arg2)
SAXException 발생 {
System.out.println("파싱 요소 종료" + arg2);
super.endElement(arg0, arg1, arg2);
}
@보수
public void startDocument()에서 SAXException이 발생합니다.
System.out.println("…………문서 구문 분석을 시작합니다……/n");
super.startDocument();
}
/*arg0은 네임스페이스입니다.
arg1은 네임스페이스를 포함하는 레이블이거나 네임스페이스가 없으면 비어 있습니다.
arg2는 네임스페이스가 없는 레이블입니다.
arg3은 분명히 속성의 모음입니다*/
@보수
공공 무효 startElement(문자열 arg0, 문자열 arg1, 문자열 arg2,
속성 arg3)은 SAXException을 발생시킵니다.
System.out.println("요소 구문 분석 시작" + arg2);
if (arg3 != null) {
for (int i = 0; i < arg3.getLength(); i++) {
// getQName()은 속성 이름을 가져오는 것입니다.
System.out.print(arg3.getQName(i) + "=/"" + arg3.getValue(i) + "/"");
}
}
System.out.print(arg2 + ":");
super.startElement(arg0, arg1, arg2, arg3);
}
}
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
공개 클래스 TestDemo {
public static void main(String[] args)에서 예외가 발생합니다.
// 1. SAXParserFactory 객체를 인스턴스화합니다.
SAXParserFactory 팩토리 = SAXParserFactory.newInstance();
// 2. 파서 생성
SAXParser 파서 = Factory.newSAXParser();
// 3. 파싱이 필요한 문서를 구해 파서를 생성하고 마지막으로 문서를 파싱합니다.
파일 f = new File("books.xml");
SaxHandler dh = 새로운 SaxHandler();
파서.parse(f, dh);
}
}
요소 책 구문 분석 시작
서적:
요소 책 구문 분석 시작
id="001"도서:
요소 제목 구문 분석 시작
제목:해리포터
구문 분석 요소 제목 종료
요소 작성자 구문 분석 시작
저자:J K. 롤링
구문 분석 요소 작성자 종료
분석 요소 책 끝
요소 책 구문 분석 시작
id="002"도서:
요소 제목 구문 분석 시작
제목:XML 학습
구문 분석 요소 제목 종료
요소 작성자 구문 분석 시작
저자:에릭 T. 레이
구문 분석 요소 작성자 종료
분석 요소 책 끝
구문 분석 요소 책 종료
…………문서 분석 종료…………
이 프로세스를 보다 명확하게 실행하기 위해 SaxHandler를 다시 작성하여 원본 XML 문서를 복원할 수도 있습니다.
재정의된 SaxHandler 클래스:
공용 클래스 SaxHandler는 DefaultHandler를 확장합니다.
@보수
공개 무효 문자(char[] arg0, int arg1, int arg2)는 SAXException을 발생시킵니다.
System.out.print(new String(arg0, arg1, arg2));
super.characters(arg0, arg1, arg2);
}
@보수
public void endDocument()에서 SAXException이 발생합니다.
System.out.println("/n 구문 분석을 종료합니다.");
super.endDocument();
}
@보수
공개 무효 endElement(문자열 arg0, 문자열 arg1, 문자열 arg2)
SAXException 발생 {
System.out.print("</");
System.out.print(arg2);
System.out.print(">");
super.endElement(arg0, arg1, arg2);
}
@보수
public void startDocument()에서 SAXException이 발생합니다.
System.out.println("파싱 시작");
문자열 s = "<?xml 버전=/"1.0/" 인코딩=/"UTF-8/"?>";
System.out.println(s);
super.startDocument();
}
@보수
공공 무효 startElement(문자열 arg0, 문자열 arg1, 문자열 arg2,
속성 arg3)은 SAXException을 발생시킵니다.
System.out.print("<");
System.out.print(arg2);
if (arg3 != null) {
for (int i = 0; i < arg3.getLength(); i++) {
System.out.print(" " + arg3.getQName(i) + "=/"" + arg3.getValue(i) + "/"");
}
}
System.out.print(">");
super.startElement(arg0, arg1, arg2, arg3);
}
}
이제는 훨씬 좋아 보이고 복원하면 구문 분석 프로세스가 더 잘 설명됩니다.