XML

eXtensible Markup Language (확장 가능한 마크업언어). W3C에서 표준화한 마크업 언어로, 구조가 존재하기는 하지만 그 구조가 항상 고정되어 있지는 않은 반구조화(semi-structured)된 자료를 표현하기에 알맞도록 설계되어 있다. 여러 면에서 이전의 SGML2와 유사하며, 사실은 XML 자체가 SGML의 부분집합에 해당한다.

최신 표준은 1996년에 나온 XML 1.0으로, 그 특성상 앞으로 새로운 버전이 나올 가능성은 매우 낮다.

목적

뭔 소린지 도무지 알 수 없으므로 예시를 들자. 아래는 "책" 정보를 담는 XML 문서의 예이다:

<?xml version="1.0"?>
<book>
  <!-- 다이어트 종결자 -->
  <title xml:lang="ko">코알랄라! <part volume="1">1</part></title>
  <isbn>978-89-5919-362-2</isbn>
  <date>2010-12-10</date>
  <publisher>
    <name>애니북스</name>
    <url>http://anibooks.com/</url>
  </publisher>
  <author class="글 그림">
    <name>Yami</name>
  </author>
</book>

여기서 <book>이나 <isbn>과 같은 태그는 XML이 아니라 이 문서를 사용하는 프로그램에서 어떻게 해야 할지 정하는 것이다. XML이 하는 일은 이 문서가 문법적으로 올바른지(well-formed) 확인하는 것 뿐이다. 따라서 맨 마지막 줄의 </book>이 사라지면 XML 처리기가 바로 오류를 확인해 줄 수 있겠으나, <url><book> 아래에 바로 들어 갈 수 있느냐 없느냐는 XML이 알 도리가 없다(사실 책 공식 사이트 이런 걸 지원한다면 필요할 수도 있다). 문서형식정의(DTD), XML스키마RELAX NG와 같은 방법을 사용해서 문서가 어떤 모양으로 생겼을지 좀 더 섬세하게 정의하는 게 가능하긴 하지만, 궁극적으로는 문서를 사용하는 쪽에서 해결해야 할 문제라는 것.

XML이 "반구조화"된 자료를 표현한다는 얘기는 여기서 나오는데, 완벽하게 형식이 고정되어 있어서 확장의 여지가 없는 자료는 아니지만 어느 정도 구조가 존재해서 그걸 드러낼 수 있도록 써 놓으면 나중에 편리한 자료가 XML의 주요한 대상이다. 예를 들어, <publisher><author>는 공통적으로 "연락처"라는 요소를 표현하지만 위에서는 <url>이 빠진 경우가 보인다. 일반적인 데이터베이스 시스템이라면 이런 요소가 빠지면 오류가 나거나, 적어도 뭔가 알아 볼 수 있는 형태(이를테면 NULL)로 처리하는 게 보통이다. 하지만 XML을 사용한다면 오류를 낼지 말지도, 그리고 이런 빠진 태그를 중요하게 여길지 말지도 자기 맘대로 할 수 있기 때문에 좀 더 유연한 처리를 할 수 있다.

XML의 또 다른 장점은 아무리 실제 표현하는 자료가 다르더라도 XML이라는 공통의 문법을 공유하기 때문에 XML에 적용 가능한 다양한 도구를 쓸 수 있다는 점이다. 예를 들어 앞에서 든 DTD나 XML 스키마 같은 것들은 문서 정의를 세밀하게 하는 데 쓸 수 있고, 문서의 일부분을 추출하기 위해서 XPathXQuery를, 문서의 각 부분이 어떤 언어로 쓰였는지 표시하기 위해 xml:lang을, 다른 XML 문서를 참조하기 위해 XLink를, XML 문서의 패턴 기반 처리를 위해 XSLT를, 그리고 XML 문서를 읽는 용도로 SAX문서객체모델(DOM) 같은 API를 사용할 수 있다.

구조

XML은 크게 다음 요소로 구성된다. 물론 솔직히 말하면 마지막 두 개는 최종 사용자한테 전혀 쓸모 없는 것 같아 보이지만(…).

  • XML 선언. 맨 처음에 <?xml … ?>라고 나온 것으로 버전 정보(version="1.0")나 사용하는 문자 인코딩(encoding="utf-8"), 그리고 현재 XML 문서를 해석하고 처리하는데 외부 형식 정의 등이 필요한지의 여부(standalone="yes")를 담고 있다.
  • 태그. 좀 더 정확히는, 시작 태그 <tagname>, 끝 태그 </tagname> 및 빈 태그 <tagname/>로 나뉜다. (빈 태그 <tagname/><tagname></tagname>과 동일하다.)
  • 엘리먼트(element). 태그로 묶여 있는 0개 이상의 다른 엘리먼트나 내용1)을 가리킨다. "엘리먼트 이름"이라고 하면 열고 닫는 태그에서 사용했던 이름을 가리킨다("태그 이름"이라고는 부르지 않음).
  • 속성(attribute). 시작 태그 또는 빈 태그에 간단한 정보를 담기 위해서 사용하며, <tagname key1="value1" key2="value2">와 같이 사용한다.
  • 주석. <!– … –>로 감싼다. 주석에는 아무 글자나 다 나와도 되는데 SGML 호환성 때문에 만은 그대로 쓸 수 없다….
  • 프로세싱 명령(processing instruction). <?xml-stylesheet type="text/css" href="style.css"?>와 같이 문서를 해석하는 데 사용해야 하지만 XML만으로는 간단하게 나타낼 수 없는 요소를 나타내는 데 쓴다.
  • 문서형식정의(DTD). 문서가 만족해야 하는 구조적인 성질(이를테면 <publisher> 안에는 <name><url>만 나올 수 있다거나)을 정의한다. <!DOCTYPE …>로 둘러 쌓인 것들인데, 직접 읽거나 쓰기보다는 XML을 지원하는 다른 도구에서 검증용으로 쓰는 경우가 많으므로 일반적으로는 무시해도 된다.

XML 문서는 기본적으로 하나의 "최상위" 엘리먼트로 구성된다. 엘리먼트 이름이나 속성 이름에는 유니코드에서 지원하는 웬만한 글자를 다 쓸 수 있어서, <얼씨구나/> 같은 태그도 허용된다(…). 이름에 :가 들어갈 경우 XML네임스페이스로 해석되어 서로 다른 표준에서 정의하는 동일한 이름을 서로 구분할 수 있도록 하고 있다. (다만 xml:로 시작하는 이름은 XML 네임스페이스와 모양은 같지만 XML 관련 표준을 위해 예약되어 있다.)

XML 기반 포맷들

모양이야 어찌 되었든 텍스트 기반 문법이고, 국제 표준인데다 공개포맷이라는 장점까지 있어서 XML을 기반으로 각 엘리먼트와 속성에 의미를 부여하여 만들어진 파일 포맷이 매우 많이 있다. 이를테면:

이런 포맷들 중 많은 수는 XML로 표현했다가 엄청나게 큰 파일이 되는 경우가 많아서, ZIP이나 gzip과 같은 압축파일포맷으로 저장할 수 있게 하는 경우가 꽤 있다. 예를 들어 SVG는 본래 파일 확장자.svg지만 gzip으로 압축했을 경우 .svgz로 쓸 수 있게 하고 있다. 오피스 파일 포맷을 위한 ODF 및 OOXML도 마찬가지.

1) XML에서는 #PCDATA(parsed character data)라고 부른다.

도쿠위키DokuWiki-custom(rev 9085d92e02)을 씁니다.
마지막 수정 2011-12-30 04:49 | 작성자 lifthrasiir