맨위로가기

Simple API for XML

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

Simple API for XML(SAX)은 XML 문서를 처리하기 위한 이벤트 기반 API이다. DOM(Document Object Model)과 달리 SAX는 XML 문서를 트리 구조로 처리하지 않고 일련의 이벤트로 표현하여, 메모리 사용량을 줄이고 병렬 처리에 적합하다. SAX는 XML-DEV 메일링 리스트에서 제정되었으며, 파싱 이벤트를 발생하는 대로 보고하고, 일반적으로 보고된 후에는 해당 정보의 거의 전부를 폐기한다. SAX는 대용량 XML 문서 처리에 적합하지만, 모든 종류의 XML 유효성 검사나 전체 문서에 대한 접근이 필요한 경우에는 DOM이나 XML 데이터베이스가 더 적합할 수 있다.

더 읽어볼만한 페이지

  • XML - 오피스 오픈 XML
    오피스 오픈 XML은 마이크로소프트에서 개발한 XML 기반의 파일 포맷으로, 문서, 스프레드시트, 프레젠테이션 등의 사무용 전자 문서를 표현하기 위해 사용되며 마이크로소프트 오피스 2007부터 기본 파일 형식으로 채택되어 ECMA 인터내셔널 및 ISO/IEC 국제 표준으로도 표준화되었다.
  • XML - 자원 기술 프레임워크
    자원 기술 프레임워크(RDF)는 웹 상의 메타데이터를 표현하기 위한 표준 모델로, URI 기반의 리소스와 트리플 구조의 속성을 사용하여 정보 자원 간의 관계를 명확하게 기술하며, 시맨틱 웹 구축의 핵심 기술로서 다양한 분야에서 활용된다.
Simple API for XML
기본 정보
SAX 로고
SAX 로고
유형XML 파싱 API
개발자XML-DEV 메일링 리스트 회원
최초 출시1998년 5월
최신 버전2.0.2 (2013년 12월 18일)
상태활성
라이선스퍼블릭 도메인
기술 정보
작성 언어자바
인터페이스자바, 파이썬, 펄, C, C++, 델파이, PHP, 액션스크립트, 오브젝티브-C, 비주얼 베이직, 에이다
API 종류이벤트 기반 API
대체 기술DOM, StAX

2. 정의

DOM과 달리, SAX에는 공식적인 규격이 없다. SAX의 자바 구현은 규범적으로 간주된다.[2] SAX는 XML 문서를 상태 독립적으로 처리하는 반면, DOM은 상태 의존적으로 처리한다.[3]

W3C에서 권고된 DOM API와 달리, SAX API는 XML-DEV 메일링 리스트의 유지(有志)들에 의해 제정되었다. 그리고 DOM에 필적하는 표준 규격으로서의 지위를 굳히고 있다.

XML 문서를 트리 구조로 취급하는 DOM과 달리, SAX는 일련의 이벤트로 표현하는 이벤트 드리븐 API이다. 따라서, 응용 소프트웨어가 적극적으로 API에 접근하는 DOM에 비해, SAX에서는 응용 소프트웨어가 이벤트를 기다리는 수동적인 동작이 대부분을 차지한다.

SAX는 전통적인 스트림과 마찬가지로 입력된 데이터를 차례로 넘겨주는 설계를 할 수 있으므로, 메모리를 절약할 수 있고, 병렬 처리에도 적합하다. XML을 읽어 Java 객체로 변환할 때는 SAX가 더 많이 사용된다. 다만, XML 문서의 처음과 마지막을 바꾸는 것과 같은 임의 접근을 필요로 하는 응용 소프트웨어에는 DOM이나 XML 데이터베이스가 더 적합하다.

Apache Cocoon과 같은 확장성이 뛰어난 우수한 SAX 응용 소프트웨어가 개발되고 있다.

3. 장점

SAX 파서는 각 파싱 이벤트를 발생하는 대로 보고하고, 보고된 후에는 해당 정보의 거의 전부를 폐기한다. 따라서 SAX 파서에 필요한 최소 메모리는 XML 파일의 최대 깊이와 단일 XML 이벤트에 포함된 최대 데이터에 비례하며, 이는 대개 무시할 만한 수준이다.[4]

반면 DOM 파서는 전체 문서에 대한 트리 표현을 메모리에 구축하므로, 대용량 문서의 경우 상당한 시간과 공간이 소요된다. 하지만 로드되면 문서의 모든 부분에 어떤 순서로든 접근할 수 있다.[4]

SAX는 이벤트 기반이므로, 문서를 한 번의 패스로 처리할 수 있는 경우 DOM 스타일 파서보다 훨씬 빠르다. 인덱싱, 변환, 서식 지정 등은 SAX로 효율적으로 처리할 수 있다. 그러나 정렬, 섹션 재배열, 링크 대상 가져오기 등 복잡한 순서로 문서 구조에 접근해야 하는 작업은 DOM이 더 효율적이다.[4]

일부 구현은 두 범주의 장점을 모두 활용하여 효율성을 높이기도 한다.[4]

DOM은 디스크에서 스트리밍 방식으로 읽으려면 레이지 평가 등의 기술이 필요하다. 주 메모리보다 큰 XML 문서를 처리하는 것은 일부 DOM 파서가 허용하지 않아 불가능하다고 여겨지기도 하지만, 디스크 공간을 메모리처럼 사용하여 우회할 수 있다.[4]

DOM API는 W3C에서 권고되었지만, SAX API는 XML-DEV 메일링 리스트에서 제정되어 표준 규격으로 자리 잡았다.

XML 문서를 트리 구조로 보는 DOM과 달리, SAX는 일련의 이벤트로 표현하는 이벤트 드리븐 API이다. 응용 소프트웨어가 API에 접근하는 DOM과 달리, SAX는 응용 소프트웨어가 이벤트를 기다리는 수동적인 동작이 대부분이다.

SAX는 전통적인 스트림처럼 입력된 데이터를 차례로 넘겨주므로 메모리를 절약하고 병렬 처리에 적합하다. XML을 Java 객체로 변환할 때는 SAX가 더 많이 사용되지만, XML 문서의 내용을 바꾸는 등 임의 접근이 필요한 경우에는 DOM이나 XML 데이터베이스가 더 적합하다.

4. 단점

SAX의 이벤트 기반 모델은 XML 파싱에 유용하지만, 몇 가지 단점이 있다.

사실상 모든 종류의 XML 유효성 검사는 전체 문서에 대한 접근이 필요하다. 가장 간단한 예로, DTD에서 IDREF 유형으로 선언된 속성은 문서 내에 ID 속성에 동일한 값을 사용하는 요소가 하나만 있어야 한다. SAX 파서에서 이를 검증하려면 모든 ID 속성(그 중 하나라도 마지막에 IDREF 속성에 의해 참조될 수 있음)과 해결될 때까지 모든 IDREF 속성을 추적해야 한다. 마찬가지로, 각 요소가 허용 가능한 자식 요소 시퀀스를 갖도록 유효성을 검사하려면 각 부모에 대해 어떤 자식 요소가 발견되었는지에 대한 정보를 부모가 닫힐 때까지 유지해야 한다.

또한, 일부 종류의 XML 처리는 단순히 전체 문서에 대한 접근을 필요로 한다. 예를 들어, XSLTXPath는 파싱된 XML 트리에서 언제든지 모든 노드에 접근할 수 있어야 한다. 편집기와 브라우저도 마찬가지로 언제든지 표시, 수정 및 재검증할 수 있어야 한다. SAX 파서는 처음에 그러한 트리를 구성하는 데 유용할 수 있지만, SAX는 이러한 전체적인 처리에 도움이 되지 않는다.

5. XML 처리

DOM과 달리, SAX(Simple API for XML)를 구현하는 파서(''SAX 파서'')는 이벤트 기반 API를 가진 스트림 파서로 작동한다.[1] 사용자는 파싱 중 이벤트가 발생할 때 호출될 콜백 메서드를 정의한다. SAX 이벤트에는 다음이 포함된다(그 외에도):


  • XML 텍스트 노드
  • XML 요소 시작과 끝
  • XML 처리 지시
  • XML 주석


일부 이벤트는 주석처럼 한 번에 쉽게 반환될 수 있는 XML 객체에 해당한다. 그러나 XML ''요소''는 다른 많은 XML 객체를 포함할 수 있으므로, SAX는 XML 자체와 마찬가지로 처음에 한 이벤트, 끝에 다른 이벤트로 표현한다. 정확히 말하면 SAX 인터페이스는 ''요소''가 아닌 ''태그''에 해당하는 ''이벤트''를 다룬다. SAX 파싱은 단방향이므로, 이전에 파싱된 데이터를 다시 읽으려면 파싱 작업을 다시 시작해야 한다.

SAX와 유사한 구현은 많지만, 실제로는 세부 사항이 다르다. 예를 들어, XML 속성은 일반적으로 요소 이벤트에 전달되는 이름 및 값 인수로 제공되지만, 별도의 이벤트로 제공되거나 모든 속성의 해시 테이블 등으로 제공될 수도 있다. 또한 일부 구현은 파싱 시작과 끝을 위한 "Init" 및 "Fin" 콜백을 제공하지만, 다른 구현은 제공하지 않는다. 특정 이벤트 유형의 정확한 이름도 구현에 따라 약간 다르다.

XML 문서를 트리 구조로 취급하는 DOM과 달리, SAX는 일련의 이벤트로 표현되는 이벤트 드리븐 API이다. 따라서 응용 소프트웨어가 API에 적극적으로 접근하는 DOM과 달리, SAX에서는 응용 소프트웨어가 이벤트를 기다리는 수동적인 동작이 대부분이다.

전통적인 스트림처럼 입력된 데이터를 차례로 넘겨주는 설계가 가능하므로, 메모리를 절약하고 병렬 처리에도 적합하다. XML을 읽어 Java 객체로 변환할 때 SAX가 더 많이 사용된다. 다만, XML 문서의 처음과 마지막을 바꾸는 등 임의 접근이 필요한 응용 소프트웨어에는 DOM이나 XML 데이터베이스가 더 적합하다.

6. 사용 예시

다음은 프로그래밍 언어 자바에서의 SAX 사용 예시이다. 특수:최근바뀜의 RSS를 읽어 제목 목록을 표시한다.

```java

import java.io.IOException;

import javax.xml.parsers.*;

import org.xml.sax.*;

import org.xml.sax.helpers.DefaultHandler;

public class Test {

public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {

SAXParserFactory factory = SAXParserFactory.newInstance();

SAXParser parser = factory.newSAXParser();

parser.parse("http://ja.wikipedia.org/w/index.php?title=%E7%89%B9%E5%88%A5:Recentchanges&feed=rss", new DefaultHandler() {

private String text = "";

private boolean isItemStarted = false;

public void startElement(String uri, String localName, String qName, Attributes attributes) {

if(qName.equals("item")) {

isItemStarted = true;

}

}

public void endElement(String uri, String localName, String qName) {

if (isItemStarted && qName.equals("title")) {

System.out.println(text);

}

}

public void characters(char[] ch, int start, int length) {

text = new String(ch, start, length);

}

});

}

}

6. 1. 상세 예제

다음 XML 문서를 예로 들어보겠다.









¶ Some Text







Pre-Text Inlined text Post-text.







이 XML 문서는 SAX 파서를 통해 전달될 때 다음과 같은 일련의 이벤트를 생성한다.

  • XML 요소 시작, 이름은 ''DocumentElement'', 속성 ''param''은 "value"와 같음
  • XML 요소 시작, 이름은 ''FirstElement''
  • XML 텍스트 노드, 데이터는 "¶ Some Text"와 같음 (참고: 특정 공백은 변경될 수 있음)
  • XML 요소 종료, 이름은 ''FirstElement''
  • 처리 명령 이벤트, 대상은 ''some_pi''이고 데이터는 ''some_attr="some_value"'' (대상 뒤의 내용은 단순한 텍스트이지만, 이 예제처럼 XML 속성의 구문을 모방하는 것이 매우 일반적임)
  • XML 요소 시작, 이름은 ''SecondElement'', 속성 ''param2''는 "something"과 같음
  • XML 텍스트 노드, 데이터는 "Pre-Text"와 같음
  • XML 요소 시작, 이름은 ''Inline''
  • XML 텍스트 노드, 데이터는 "Inlined text"와 같음
  • XML 요소 종료, 이름은 ''Inline''
  • XML 텍스트 노드, 데이터는 "Post-text."와 같음
  • XML 요소 종료, 이름은 ''SecondElement''
  • XML 요소 종료, 이름은 ''DocumentElement''


위 샘플의 첫 번째 줄은 XML 선언이며 처리 명령이 아님에 유의해야 한다. 따라서 처리 명령 이벤트로 보고되지 않는다 (일부 SAX 구현에서는 XML 선언만을 위한 별도의 이벤트를 제공하지만).

위 결과는 다를 수 있다. SAX 사양에서는 텍스트의 특정 섹션이 여러 개의 순차적인 텍스트 이벤트로 보고될 수 있다고 명시적으로 언급한다. 예를 들어, 많은 파서는 숫자 문자 참조에 대해 별도의 텍스트 이벤트를 반환한다. 따라서 위 예에서 SAX 파서는 다음과 같은 다른 일련의 이벤트를 생성할 수 있다.

  • XML 요소 시작, 이름은 ''FirstElement''
  • XML 텍스트 노드, 데이터는 "¶" (유니코드 문자 U+00b6)와 같음
  • XML 텍스트 노드, 데이터는 " Some Text"와 같음
  • XML 요소 종료, 이름은 ''FirstElement''


다음은 프로그래밍 언어 자바에서의 사용 예시이다. 특수:최근바뀜의 RSS를 읽어 제목 목록을 표시한다.

```java

import java.io.IOException;

import javax.xml.parsers.*;

import org.xml.sax.*;

import org.xml.sax.helpers.DefaultHandler;

public class Test {

public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {

SAXParserFactory factory = SAXParserFactory.newInstance();

SAXParser parser = factory.newSAXParser();

parser.parse("http://ja.wikipedia.org/w/index.php?title=%E7%89%B9%E5%88%A5:Recentchanges&feed=rss", new DefaultHandler() {

private String text = "";

private boolean isItemStarted = false;

public void startElement(String uri, String localName, String qName, Attributes attributes) {

if(qName.equals("item")) {

isItemStarted = true;

}

}

public void endElement(String uri, String localName, String qName) {

if (isItemStarted && qName.equals("title")) {

System.out.println(text);

}

}

public void characters(char[] ch, int start, int length) {

text = new String(ch, start, length);

}

});

}

}

참조

[1] 웹사이트 SAX http://www.webopedia[...] WEBOPEDIA 2011-05-02
[2] 웹사이트 saxproject.org http://www.saxprojec[...]
[3] 웹사이트 Simple API for XML http://download.orac[...] ORACLE 2011-05-02
[4] 웹사이트 XML Parsers: DOM and SAX Put to the Test http://www.devx.com/[...] devX 2001-02



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com