====== XML ====== eXtensible Markup Language (확장 가능한 [[마크업언어]]). [[W3C]]에서 표준화한 마크업 언어로, 구조가 존재하기는 하지만 그 구조가 항상 고정되어 있지는 않은 [[반구조화모델|반구조화]](semi-structured)된 자료를 표현하기에 알맞도록 설계되어 있다. 여러 면에서 이전의 [[SGML]]2와 유사하며, 사실은 XML 자체가 SGML의 부분집합에 해당한다. 최신 표준은 1996년에 나온 [[http://www.w3.org/TR/REC-xml/|XML 1.0]]으로, 그 특성상 앞으로 새로운 버전이 나올 가능성은 매우 낮다. ===== 목적 ===== 뭔 소린지 도무지 알 수 없으므로 예시를 들자. 아래는 "책" 정보를 담는 XML 문서의 예이다: 코알랄라! <part volume="1">1</part> 978-89-5919-362-2 2010-12-10 애니북스 http://anibooks.com/ Yami 여기서 ''''이나 ''''과 같은 [[태그]]는 XML이 아니라 이 문서를 사용하는 프로그램에서 어떻게 해야 할지 정하는 것이다. XML이 하는 일은 이 문서가 문법적으로 올바른지(well-formed) 확인하는 것 뿐이다. 따라서 맨 마지막 줄의 ''''이 사라지면 XML 처리기가 바로 오류를 확인해 줄 수 있겠으나, ''''이 '''' 아래에 바로 들어 갈 수 있느냐 없느냐는 XML이 알 도리가 없다(사실 책 공식 사이트 이런 걸 지원한다면 필요할 수도 있다). [[문서형식정의]](DTD), [[XML스키마]]나 [[RELAX NG]]와 같은 방법을 사용해서 문서가 어떤 모양으로 생겼을지 좀 더 섬세하게 정의하는 게 가능하긴 하지만, 궁극적으로는 문서를 사용하는 쪽에서 해결해야 할 문제라는 것. XML이 "반구조화"된 자료를 표현한다는 얘기는 여기서 나오는데, 완벽하게 형식이 고정되어 있어서 확장의 여지가 없는 자료는 아니지만 어느 정도 구조가 존재해서 그걸 드러낼 수 있도록 써 놓으면 나중에 편리한 자료가 XML의 주요한 대상이다. 예를 들어, ''''나 ''''는 공통적으로 "연락처"라는 요소를 표현하지만 위에서는 ''''이 빠진 경우가 보인다. 일반적인 [[데이터베이스]] 시스템이라면 이런 요소가 빠지면 오류가 나거나, 적어도 뭔가 알아 볼 수 있는 형태(이를테면 [[NULL]])로 처리하는 게 보통이다. 하지만 XML을 사용한다면 오류를 낼지 말지도, 그리고 이런 빠진 태그를 중요하게 여길지 말지도 자기 맘대로 할 수 있기 때문에 좀 더 유연한 처리를 할 수 있다. XML의 또 다른 장점은 아무리 실제 표현하는 자료가 다르더라도 XML이라는 공통의 문법을 공유하기 때문에 XML에 적용 가능한 다양한 도구를 쓸 수 있다는 점이다. 예를 들어 앞에서 든 DTD나 XML 스키마 같은 것들은 문서 정의를 세밀하게 하는 데 쓸 수 있고, 문서의 일부분을 추출하기 위해서 [[XPath]]와 [[XQuery]]를, 문서의 각 부분이 어떤 언어로 쓰였는지 표시하기 위해 [[xml lang|xml:lang]]을, 다른 XML 문서를 참조하기 위해 [[XLink]]를, XML 문서의 패턴 기반 처리를 위해 [[XSLT]]를, 그리고 XML 문서를 읽는 용도로 [[SAX]]나 [[문서객체모델]](DOM) 같은 [[애플리케이션프로그래밍인터페이스|API]]를 사용할 수 있다. ===== 구조 ===== XML은 크게 다음 요소로 구성된다. 물론 솔직히 말하면 마지막 두 개는 최종 사용자한테 전혀 쓸모 없는 것 같아 보이지만(...). * XML 선언. 맨 처음에 ''''라고 나온 것으로 버전 정보(''version="1.0"'')나 사용하는 [[문자인코딩]](''encoding="utf-8"''), 그리고 현재 XML 문서를 해석하고 처리하는데 외부 형식 정의 등이 필요한지의 여부(''standalone="yes"'')를 담고 있다. * [[태그]]. 좀 더 정확히는, 시작 태그 '''', 끝 태그 '''' 및 빈 태그 ''''로 나뉜다. (빈 태그 ''''는 ''''과 동일하다.) * 엘리먼트(element). 태그로 묶여 있는 0개 이상의 다른 엘리먼트나 내용((XML에서는 ''#PCDATA''(parsed character data)라고 부른다.))을 가리킨다. "엘리먼트 이름"이라고 하면 열고 닫는 태그에서 사용했던 이름을 가리킨다("태그 이름"이라고는 부르지 않음). * 속성(attribute). 시작 태그 또는 빈 태그에 간단한 정보를 담기 위해서 사용하며, ''''와 같이 사용한다. * 주석. ''''로 감싼다. 주석에는 아무 글자나 다 나와도 되는데 SGML 호환성 때문에 ''--''만은 그대로 쓸 수 없다.... * 프로세싱 명령(processing instruction). ''''와 같이 문서를 해석하는 데 사용해야 하지만 XML만으로는 간단하게 나타낼 수 없는 요소를 나타내는 데 쓴다. * [[문서형식정의]](DTD). 문서가 만족해야 하는 구조적인 성질(이를테면 '''' 안에는 ''''과 ''''만 나올 수 있다거나)을 정의한다. ''''로 둘러 쌓인 것들인데, 직접 읽거나 쓰기보다는 XML을 지원하는 다른 도구에서 검증용으로 쓰는 경우가 많으므로 일반적으로는 무시해도 된다. XML 문서는 기본적으로 하나의 "최상위" 엘리먼트로 구성된다. 엘리먼트 이름이나 속성 이름에는 [[유니코드]]에서 지원하는 웬만한 글자를 다 쓸 수 있어서, ''<얼씨구나/>'' 같은 태그도 허용된다(...). 이름에 '':''가 들어갈 경우 [[XML네임스페이스]]로 해석되어 서로 다른 표준에서 정의하는 동일한 이름을 서로 구분할 수 있도록 하고 있다. (다만 ''xml:''로 시작하는 이름은 XML 네임스페이스와 모양은 같지만 XML 관련 표준을 위해 예약되어 있다.) ===== XML 기반 포맷들 ===== 모양이야 어찌 되었든 [[텍스트포맷|텍스트 기반]] 문법이고, 국제 표준인데다 [[공개포맷]]이라는 장점까지 있어서 XML을 기반으로 각 엘리먼트와 속성에 의미를 부여하여 만들어진 [[파일포맷]]이 매우 많이 있다. 이를테면: * [[XHTML]]: [[HTML]]의 XML 표현 * [[RSS]]: 웹에서 지속적으로 변경되는 정보를 수신(syndication)하기 위한 프로토콜 * [[RDF]]: [[시맨틱웹]]을 위해 [[온톨로지]]를 표현하기 위한 마크업 언어 * [[SVG]]: 2차원 벡터 [[그래픽파일포맷]] * [[MathML]]: W3C에서 제정한 수식을 표현하기 위한 마크업 언어 * [[닥북]](DocBook): 기술 문서를 위한 마크업 언어 * [[오픈도큐먼트]](ODF): [[오픈오피스]]에서 유래한 오피스 파일 포맷을 표현하기 위한 마크업 언어 ([[ISO IEC]] 26300) * [[오피스오픈XML]](OOXML): [[마이크로소프트]]에서 [[마이크로소프트오피스]] 파일 포맷을 표현하기 위해 만든 마크업 언어 ([[ISO IEC]] 29500) * [[키홀마크업언어]](KML): [[구글어스]]에서 쓰는 2차원 및 3차원 지도 표현 언어 이런 포맷들 중 많은 수는 XML로 표현했다가 엄청나게 큰 파일이 되는 경우가 많아서, [[ZIP]]이나 [[gzip]]과 같은 [[압축파일포맷]]으로 저장할 수 있게 하는 경우가 꽤 있다. 예를 들어 SVG는 본래 [[파일확장자]]가 ''.svg''지만 gzip으로 압축했을 경우 ''.svgz''로 쓸 수 있게 하고 있다. 오피스 파일 포맷을 위한 ODF 및 OOXML도 마찬가지. {{tag>파일포맷}}