SAX 파서를 사용하여 XML 파일 구문 분석



Java는 DOM 파서, SAX 파서 또는 StAX 파서를 사용하여 XML 파일을 파싱하는 것과 같이 XML 파일을 파싱하는 다양한 방법을 제공합니다.

Java는 XML 파일을 구문 분석하는 다양한 방법을 제공합니다. 예를 들어, DOM 파서, SAX 파서 또는 StAX 파서를 사용하여 XML 파일을 파싱합니다. 이 게시물에서는 SAX 파서를 사용하여 XML 파일을 구문 분석하는 방법을 살펴 봅니다.





SAX 파서를 사용하여 XML 파일을 파싱하는 방법에 대해 자세히 알아보기 전에 먼저 다른 파서를 통한 파싱의 차이점과 다른 파서를 선택하는시기를 살펴 보겠습니다.

SAX 파서 – SAX는 Simple API for XML의 약어입니다. SAX Parser는 XML 파일을 한 줄씩 구문 분석하고 XML 파일에서 여는 태그, 닫는 태그 또는 문자 데이터를 발견하면 이벤트를 트리거합니다. 이것이 SAX 파서를 이벤트 기반 파서라고 부르는 이유입니다.



DOM 파서 – DOM은 Document Object Model의 약어입니다. SAX 파서와 달리 DOM 파서는 전체 XML 파일을 메모리에로드하고 트리의 각 노드가 XML 파일의 구성 요소를 나타내는 트리 구조를 만듭니다. DOM 파서를 사용하면 노드를 만들고, 노드를 제거하고, 해당 내용을 변경하고, 노드 계층을 탐색 할 수 있습니다. DOM은 XML 파일로 작업하는 동안 최대의 유연성을 제공하지만 잠재적으로 큰 메모리 풋 프린트의 비용과 큰 XML 파일의 경우 상당한 프로세서 요구 사항을 동반합니다.

StAX 파서 – StAX는 Streaming API for XML의 약어입니다. 스트림 기반 파서는 애플리케이션에 메모리 제한이있을 때 매우 유용합니다. 예를 들어, Java Micro Edition을 실행하는 휴대폰. 마찬가지로 애플리케이션이 여러 요청을 동시에 처리해야하는 경우 (예 : 애플리케이션 서버) StAX 구문 분석기를 사용해야합니다.

스트림 기반 구문 분석은 다음과 같이 추가로 분류 할 수 있습니다.

풀 파싱 – 풀 구문 분석에서 클라이언트 응용 프로그램은 XML 정보 집합과 상호 작용해야 할 때 XML 구문 분석 라이브러리의 메서드를 호출합니다. 즉, 클라이언트는 명시 적으로 요청할 때만 XML 데이터를 가져옵니다.



푸시 파싱 – 푸시 구문 분석에서 XML infoset의 요소를 만나면 XML 데이터를 클라이언트에 푸시하는 것은 XML 구문 분석기입니다. 즉, 파서는 응용 프로그램을 사용할 준비가되었는지 여부에 관계없이 응용 프로그램에 데이터를 보냅니다.

SAX, DOM 및 StAX 파서 비교 :

아래 표에는 SAX, DOM 및 StAX 파서의 기능이 요약되어 있습니다.

Java_bloge_2

이제 다른 파서에 대해 알았으니 SAX 파서를 사용하여 XML 파일을 파싱하는 방법을 살펴 보겠습니다.

XML 파일
다음은 Java 객체를 구문 분석하고 구성 할 XML 파일입니다.

The Bourne Identity Doug Liman 119 Matt Damon, Franka Potente 2002 The Bourne Supremacy Paul Greengrass 108 Matt Damon, Franka Potente, Joan Allen 2004 The Bourne Ultimatum Paul Greengrass 115 Matt Damon, Edgar Ramirez, Joan Allen 2007 The Bourne Legacy Tony Gilroy 135 Jeremy Renner , Rachel Weisz, Edward Norton 2012

프로젝트 구조
다음은 Eclipse IDE의 프로젝트 구조 스크린 샷입니다.

예제와 함께 pl SQL 자습서

다음은 영화 개체 목록을 보유한 DVD 클래스입니다.

package co.edureka.parsers.sax import java.util.List public class DVD {private String name private List movies public String getName () {return name} public void setName (String name) {this.name = name} public List getMovies () {영화 반환} public void setMovies (영화 목록) {this.movies = 영화}}

영화 개체에는 영화의 이름, 감독, 실행 시간 (기간), 개봉 연도 및 영화 출연진과 같은 속성이 있습니다.

package co.edureka.parsers.sax public class Movie {private String name private String directors private int runtime private int release private String cast public String getName () {return name} public void setName (String name) {this.name = name} public String getDirectors () {return directors} public void setDirectors (String directors) {this.directors = directors} public int getRuntime () {return runtime} public void setRuntime (int runtime) {this.runtime = runtime} public int getReleased ( ) {반환 해제} public void setReleased (int release) {this.released = release} public String getCast () {return cast} public void setCast (String cast) {this.cast = cast} @Override public String toString () { return 'Movie [name ='+ name + ', directors ='+ directors + ', runtime ='+ runtime + ', release ='+ release + ', cast ='+ cast + ']'}}

SAX 핸들러 구현 :

org.xml.sax.helpers를 확장 할 것입니다. 많은 콜백 메서드를 제공하고 다음 메서드를 재정의하는 DefaultHandler 클래스 :

startElement () –이 메소드는 태그의 시작이 발견되면 호출됩니다.

endElement () –이 메소드는 태그의 끝이 발견 될 때 호출됩니다.

문자 () –이 메소드는 일부 텍스트 데이터가 발견 될 때 호출됩니다.

참고 : 필요한 경우 재정의 할 수있는 startDocument (), endDocument () 등과 같은 다른 많은 콜백 메서드가 있습니다.

package co.edureka.parsers.sax import java.util.ArrayList import java.util.List import org.xml.sax.Attributes import org.xml.sax.helpers.DefaultHandler public class SAXHandler extends DefaultHandler {DVD dvd = new DVD ( ) ListmovieList = new ArrayList () Movie movie = null String content = null public void startElement (String namespaceURI, String localName, String qname, Attributes attributes) {if (qname.equals ( 'dvd')) {String dvdName = attributes.getValue ( 'name') dvd.setName (dvdName)} else if (qname.equals ( 'movie')) {movie = new Movie ()}} public void endElement (String namespaceURI, String localName, String qname) {switch (qname ) {case 'movie': movieList.add (movie) break case 'name': movie.setName (content) break case 'directors': movie.setDirectors (content) break case 'released': movie.setReleased (Integer.parseInt (content)) break case 'runtime': movie.setRuntime (Integer.parseInt (content)) break case 'cast': movie.setCast (content) break case 'dvd': dvd.setMovies (movieList) break}} public void chara cters (char [] ch, int start, int length) {content = new String (ch, start, length)} public DVD getDVD () {return dvd}}

SAX 핸들러 테스트
이제 SAXHandler를 테스트 해 보겠습니다. 아래는 먼저 SAXParserFactory에서 SAXParser의 인스턴스를 가져오고 파일과 핸들러 인스턴스라는 두 개의 인수를 사용하는 구문 분석 메서드를 호출하는 테스트 클래스 SAXTest입니다.

package co.edureka.parsers.sax import java.io.IOException import java.nio.file.Path import java.nio.file.Paths import java.util.List import javax.xml.parsers.ParserConfigurationException import javax.xml.parsers .SAXParser import javax.xml.parsers.SAXParserFactory import org.xml.sax.SAXException public class SAXTest {public static void main (String [] args) throws ParserConfigurationException, SAXException, IOException {SAXParserFactory parserFactor = SAXParserFactory.newInstance () SAXParser parser = parserFactor.newSAXParser () SAXHandler 핸들러 = new SAXHandler () 경로 경로 = Paths.get ( 'src / resources', 'movies.xml') parser.parse (path.toFile (), handler) DVD dvd = handler.getDVD ( ) 목록 movies = dvd.getMovies () System.out.println ( 'DVD 이름 :'+ dvd.getName ()) for (Movie movie : movies) {System.out.println (movie)}}}

SAXTest 클래스를 실행하면 다음과 같은 출력이 표시됩니다.

노트 : movies.xml과 다른 구조로 XML 파일을 구문 분석하려는 경우 startElement () 및 endElement () 메서드의 코드를 변경해야합니다.

코드를 직접 사용 해보고 싶다면 코드를 다운로드하십시오.
[buttonleads form_title =”코드 다운로드”redirect_url = https : //edureka.wistia.com/medias/st5gg7rp15 course_id = 44 button_text =”코드 다운로드”]

질문이 있으십니까? 의견란에 언급 해 주시면 연락 드리겠습니다.

관련 게시물: