XML용 심플한 API

Simple API for XML

SAX(Simple API for XML)는 XML 문서를 해석하기 위한 이벤트 기반 온라인 알고리즘으로 XML-DEV 메일링 [1]목록에 의해 개발된 API사용합니다.SAX는 Document Object Model(DOM; 문서 객체 모델)에 의해 제공되는 것 대신 XML 문서에서 데이터를 읽기 위한 메커니즘을 제공합니다.여기서 DOM은 문서 전체에서 동작합니다.사용자의 편의를 위해 XML 문서의 완전한 추상 구문 트리를 작성합니다.SAX 파서는 XML 문서의 각 부분에 대해 순차적으로 동작하며 입력 스트림을 1회[clarification needed] 통과하면서 해석 이벤트를 발행합니다.

정의.

DOM과 달리 SAX의 정식 사양은 없습니다.SAX의 Java 실장은 [2]규범적으로 간주됩니다.XML [3]문서의 상태 의존형 처리에 사용되는 DOM과는 달리 SAX는 문서를 상태 독립적으로 처리합니다.

혜택들

SAX 파서는 발생한 각 해석 이벤트만 보고하면 됩니다.보통 보고되면 거의 모든 정보를 폐기합니다(단, 엔드 태그 등의 나중에 발생하는 오류를 잘못된 순서로 포착하기 위해 아직 닫히지 않은 모든 요소의 목록 등 일부 정보를 보관합니다).따라서 SAX 파서에 필요한 최소 메모리는 XML 파일의 최대 깊이(즉, XML 트리의 최대 깊이)와 단일 XML 이벤트에 관련된 최대 데이터(단일 시작 태그의 이름과 속성, 처리 명령의 내용 등)에 비례합니다.

이 정도의 메모리는 보통 무시할 수 있는 것으로 간주됩니다.반대로 DOM 파서는 처음에 문서 전체의 트리 표현을 메모리에 구축해야 합니다.따라서 전체 문서 길이에 따라 증가하는 메모리를 사용합니다.대용량 문서에는 상당한 시간과 공간이 소요됩니다(메모리 할당 및 데이터 구조 구축에는 시간이 걸립니다).물론, 일단 로드된 문서의 모든 부분에 대한 액세스 순서는 임의입니다.

SAX의 이벤트 주도의 특성으로 인해 문서 처리는 일반적으로 DOM 스타일의 파서보다 훨씬 빠릅니다. 단, 처음부터 끝까지 처리할 수 있으면 됩니다.인덱싱, 다른 포맷으로의 변환, 매우 간단한 포맷 등 많은 작업을 이러한 방식으로 수행할 수 있습니다.정렬, 섹션 재배치, 링크에서 타깃으로의 이동, 이후 요소 처리에 도움이 되는 정보 검색 등의 다른 작업은 복잡한 순서로 문서 구조에 액세스해야 하며 여러 SAX 패스를 사용하는 것보다 DOM을 사용하는 것이 훨씬 빠릅니다.

구현에 따라서는 어느 카테고리에도 적합하지 않은 경우가 있습니다.DOM 접근법은 영속적인 데이터를 디스크에 보존할 수 있습니다.또한 SoftQuad Author/Editor 등의 에디터나 DynaText 등의 대형 문서 브라우저/인덱서는 나중에 사용할 수 있도록 정보를 현명하게 캐시할 수 있습니다(유효한 SAX 파서는 더 많은 정보를 유지할 수 있습니다).(상기보다 큰 영향을 미칩니다).이러한 실장은 DOM/SAX의 트레이드오프를 흐리게 하지만 실제로는 매우 효과적입니다.

DOM의 성질상 디스크로부터의 스트림 판독에는 느린 평가, 캐시, 가상 메모리, 영속적인 데이터 구조, 또는 다른 기술(미국 특허 5557722에 공개되어 있다) 등의 기술이 필요합니다.일부 DOM 파서에서는 허용되지 않기 때문에 메인 메모리보다 큰 XML 문서를 처리하는 것이 불가능하다고 생각될 수 있습니다.그러나 디스크 공간을 메모리로 사용하여 기본 메모리보다 큰 데이터 세트를 정렬하는 것도 이러한 [4]제한을 피할 수 있습니다.

결점

SAX의 이벤트 구동 모델은 XML 해석에 도움이 되지만 몇 가지 단점이 있습니다.

거의 모든 종류의 XML 검증에는 문서에 대한 전체 액세스가 필요합니다.가장 간단한 예로는 DTD에서 IDREF 유형으로 선언된 Atribute를 사용하려면 ID Atribute에 동일한 값을 사용하는 요소가 문서 내에1개만 있어야 합니다.이것을 SAX 파서로 검증하려면 , 모든 ID 어트리뷰트(그 어느 것이라도, 마지막에 IDREF 어트리뷰트에 의해서 참조되는 경우가 있습니다) 및 모든 IDREF 어트리뷰트가 해결될 때까지 추적해야 합니다.마찬가지로 각 요소에 허용 가능한 일련의 자식 요소가 있는지 확인하려면 부모가 닫힐 때까지 각 부모에 대해 어떤 자식 요소가 확인되었는지에 대한 정보를 유지해야 합니다.

또한 일부 XML 처리에서는 문서 전체에 액세스할 수 있어야 합니다. 예를 들어 XSLTXPath는 구문 분석된 XML 트리의 어떤 노드에도 언제든지 액세스할 수 있어야 합니다.에디터와 브라우저도 마찬가지로 언제든지 표시, 수정 및 재검증을 할 수 있어야 합니다.처음에는 SAX 파서를 사용하여 이러한 트리를 구축할 수 있지만 SAX는 이러한 처리 전반에 도움이 되지 않습니다.

SAX에 의한 XML 처리

SAX(SAX 파서)를 구현하는 파서는 이벤트 구동 API[1]함께 스트림 파서로서 기능합니다.사용자는 해석 중에 이벤트가 발생했을 때 호출되는 여러 콜백 방식을 정의합니다.SAX 이벤트에는 다음과 같은 것이 있습니다.

  • XML 텍스트노드
  • XML 요소의 시작과 끝
  • XML 처리 명령
  • XML 코멘트

일부 이벤트는 주석과 같이 한 번에 쉽게 반환되는 XML 개체에 해당합니다.단, XML 요소에는 다른 많은 XML 개체를 포함할 수 있습니다.따라서 SAX는 XML 자체와 마찬가지로 첫 번째 이벤트와 마지막 이벤트를 통해 XML 요소를 나타냅니다.올바르게 말하면, SAX 인터페이스는 요소를 취급하는 것이 아니라, 태그에 상당하는 이벤트를 취급합니다.SAX 해석은 단방향입니다.이전 해석된 데이터는 해석 조작을 다시 시작하지 않으면 다시 읽을 수 없습니다.

SAX와 유사한 구현이 많이 존재합니다.실제로 세부 사항은 다양하지만 전체 모델은 동일합니다.예를 들어 XML 속성은 일반적으로 요소 이벤트에 전달되는 이름 및 값 인수로 제공되지만 개별 이벤트로 제공되거나 해시 테이블 또는 모든 속성의 유사한 컬렉션을 통해 제공될 수도 있습니다.다른 구현에서는 해석의 시작과 종료에 대해 "Init" 및 "Fin" 콜백을 제공하는 구현도 있지만 그렇지 않은 구현도 있습니다.특정 이벤트 유형의 정확한 이름도 구현에 따라 약간 다릅니다.

다음 XML 문서를 지정합니다.

 <?xml version="1.0" encoding="UTF-8"?> <DocumentElement param="value"> <FirstElement> &xb6; 일부 텍스트 </FirstElement> <?some_pi some_attr="some_value"?> <Second Element param2="something"> 텍스트 전 <인라인>인라인 텍스트 </Inline> 포스트 텍스트.</Second Element> </Document Element>

이 XML 문서는 SAX 파서를 통과하면 다음과 같은 일련의 이벤트가 생성됩니다.

  • "value"와 동일한 속성 매개 변수를 사용하여 DocumentElement라는 이름의 XML 요소 시작
  • FirstElement라는 이름의 XML 요소 시작
  • 데이터가 "&#xb6; 일부 텍스트"와 동일한 XML 텍스트 노드(주의: 특정 공백은 변경될 수 있음)
  • FirstElement라는 이름의 XML 요소 끝
  • 대상이 some_pi이고 데이터가 some_attr="some_value"인 Processing Instruction 이벤트(대상 뒤의 내용은 텍스트일 뿐이지만 이 예시와 같이 XML 속성의 구문을 모방하는 것은 매우 일반적입니다)
  • "something"과 동일한 특성 param2를 가진 SecondElement라는 이름의 XML 요소 시작
  • 데이터가 "사전 텍스트"와 동일한 XML 텍스트 노드
  • Inline이라는 이름의 XML 요소 시작
  • "인라인 텍스트"와 동일한 데이터를 가진 XML 텍스트 노드
  • XML 요소 끝, Inline
  • "Post-text"와 동일한 데이터를 가진 XML Text 노드.
  • XML 요소 엔드, 이름: SecondElement
  • XML 요소 끝, DocumentElement라는 이름

위의 샘플의 첫 번째 행은 XML 선언이며 처리 명령이 아닙니다.따라서 처리 명령 이벤트로 보고되지 않습니다(단, 일부 SAX 실장에서는 XML 선언에만 별도의 이벤트가 제공됩니다).

위의 결과는 다를 수 있습니다.SAX 사양에서는 텍스트의 특정 섹션을 여러 개의 순차 텍스트이벤트로 보고할 수 있다고 의도적으로 기술하고 있습니다.예를 들어 많은 파서는 숫자 문자 참조를 위해 개별 텍스트 이벤트를 반환합니다.따라서 위의 예에서 SAX 파서는 다음과 같은 다른 일련의 이벤트를 생성할 수 있습니다.

  • FirstElement라는 이름의 XML 요소 시작
  • 데이터가 "&#xb6;"(Unicode 문자 U+00b6)과 동일한 XML 텍스트 노드
  • 데이터가 "일부 텍스트"와 동일한 XML 텍스트 노드
  • FirstElement라는 이름의 XML 요소 끝

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b "SAX". webopedia.com. WEBOPEDIA. Retrieved 2011-05-02. Short for Simple API for XML, an event-based API that, as an alternative to DOM, allows someone to access the contents of an XML document. SAX was originally a Java-only API. The current version supports several programming language environments other than Java. SAX was developed by the members of the XML-DEV mailing list.
  2. ^ "saxproject.org".
  3. ^ "Simple API for XML". oracle.com. ORACLE. Retrieved 2011-05-02. Note: In a nutshell, SAX is oriented towards state independent processing, where the handling of an element does not depend on the elements that came before. StAX, on the other hand, is oriented towards state dependent processing. For a more detailed comparison, see SAX and StAX in Basic Standards and When to Use SAX.
  4. ^ "XML Parsers: DOM and SAX Put to the Test". devX. Retrieved 2011-10-20. Although these tests do not show it, SAX parsers typically are faster for very large documents where the DOM model hits virtual memory or consumes all available memory.

추가 정보

외부 링크