이 글은 W3C 의 XML 투토리얼에 있는 내용을 간략히 정리한 것입니다.
저는 현재 공간정보 표준들을 정리하는 중입니다. 지형지물목록이나 메타데이터 등의 많은 표준들이 XML 을 표준으로 사용하고 있기 때문에 어쩔 수 없이 이 글을 찾아보게 된겁니다.
그런데... XML이 정보를 담기위한 목적이라는 것은 어렴풋이 알고 있었지만, 이렇게 광범위하게 사용될 수 있을지는 몰랐네요. 아주 간략하게 어떤 기능이 있는지 어떻게 활용할 수 있는지에 대해서만 수박 겉핥기 식으로 훝어봤습니다만, 많이 도움이 될 것 같습니다. 이 글을 방문하신 분들도 저처럼 도움이 되시길 바랍니다.
XML 이란
- eXtensible Markup Language
- HTML과 비슷한 마크업 언어
- HTML은 표현. XML은 데이터 그 자체
- XML에서는 tag가 미리 정의되어 있지 않음
- 데이터를 저장하거나 전송하는 목적
- 표현과는 관련이 없다.
- self-descriptive (하나의 문서만으로 모든 것을 설명할 수 있게) 설계됨
- W3C에서 추천함
- 데이터 공유가 쉽다.
- 전송이 쉽다
- 플랫폼에 독립적이다.
- 데이터 사용을 쉽게 한다.
XML은 어떻게 사용하는가
- 데이터와 표현을 분리한다. (XML에는 표현하기 위한 어떤 정보도 없다)
- HTML에 보조하여 사용하기도 한다.
- 별도의 XML 파일로 저장하고, JavaScript로 HTML에 읽어들일 수 있다.
- 산업분야별로 정해진 XML 포맷이 있다. 이것을 사용하여 데이터를 전송한다.
- 예를 들어 XML News 는 뉴스를 교환하기 위한 사양이다.
- NOAA의 날씨 서비스는 XML Weather Service를 이용한다.
XML의 트리구조
- root 엘리먼트 밑에 child 엘리먼트가 있다.
- parent - child - sibling
- 모든 엘리먼트는 내용(text content)와 속성(attribute 예: category="cooking") 을 가질 수 있다.
XML의 구조 규칙 ("Well Formed")
- 반드시 Root 엘리먼트(모든 엘리먼트의 parent)가 있어야 한다.
- prolog는 첫줄에 있어야 한다. (선택)
- <?xml version="1.0" encoding="UTF-8"?>
- UTF-8이 기존 문자인코딩이다. (HTML5, CSS, JavaScript, PHP, SQL 등에서도 UTF-8이 기본)
- 모든 XML 엘리먼트는 끝 태그(closing tag)가 있어야 한다.
- prolog의 경우엔 xml 문서요소가 아니므로 끝 태그가 없다.
- XML 태그는 대소문자를 구분한다. 시작태그와 끝태그는 동일해야 한다.
- 중첩순서가 맞아야 한다. - First in Last out
- XML 속성값은 반드시 "따옴표" 로 묶어야 함.
- <note date="12/11/2007">
- 특수문자는...
- < > & ' "
- 코멘트는
- <!-- 이렇게 하면 코멘트 -->
- XML에서는 blank를 여러개 사용해도 무방하다.
XML 엘리먼트
- 시작태그와 끝태그 사이에 있는 모든 것. (시작태그와 끝태그도 포함
- 엘리먼트는 다음과 같은 것들을 가질 수 있다.
- text
- attribute
- 다른 element
- Empty Element도 존재할 수 있고, 속성을 가질 수 있다. 아래 두가지 형태 모두 허용
- <element></element>
- <element />
- XML 명명 규칙
- 대소문자 구분. 시작은 문자또는 underscore
- xml,XML,Xml 등으로 시작할 수 없음
- 문자, 숫자, 하이픈, underscore, 마침표(. period)를 포함해도 된다.
- 공백은 포함할 수 없다.
- 이름 지을때 주의할 점
- 마이너스, 마침표, 콜론 등은 사용하지 않는 게 좋고, plain 알파벳을 사용하는 것이 좋다.
- 명명 스타일은 정해진 게 없다
- 전체소문자, 전체대문자,_로 연결, Pascal case, Camel case 모두 허용
- 무엇을 사용하던 일관성있게 사용하라.
- Element는 확장 가능하다.
- 확장하여 추가하더라도, 어플쪽엔 아무런 문제도 없다.
XML 속성
- 반드시 따옴표 사용. 홑따옴표, 곁따옴표 모두 OK
- <person gender="female">
- <person gender='female'>
- 따옴표 내에 따옴표 있을 경우, 다른 것을 사용하던지 "를 사용
- 무엇을 속성으로 할지, 엘리먼트로 할지는 정해진 것이 없음. 편한대로. 정보도 동일함
- 되도록이면 ATTRIBUTE 보다는 Element를 사용
- 엘리먼트는 값을 여러개 가질 수도 있고, 트리구조를 가질 수 있고, 쉽게 확장할 수 있음.
XML 네임스페이스
- 다른 응용에 속한 XML 문서를 찹치려고 하면 충돌이 발생할 수 있음
- 이름접두어(name prefix)를 사용하면 해결가능 <h:table> <h:tr> ... </h:tr> </h:table>
- 접두어를 사용하려면 네임스페이스를 반드시 정의해야 함.
- <h:table xmlns="namespaceURI"> <h:tr> ... </h:tr> </h:table> 등으로 사용.
- xmlns 는 속성. 이 속성이 이하에 있는 h: 접두어에 대해 적법한 네임스페이스를 지정함
- 네임스페이스를 어떤 엘리먼트에 정의하면, 그 prefix를 사용하는 모든 자식 엘리먼트는 해당 네임스페이스에 속하게 됨.
- 네임스페이스를 root 엘리먼트에 한꺼번에 정의할 수도 있음
- 단, 여기에 있는 URI는 parser가 사용하지 않음. 고유한 이름을 지정하는 목적일 뿐.
- 하지만, 네임스페이스 정보가 담긴 웹페이지를 가르키는 포인터로서 네임스페이스를 사용하는 경우가 많음.
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="https://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
- default 네임스페이스를 사용하면 각 엘리먼트마다 접두사를 붙일 필요없음
- <table xmlns="namespaceURI"> <tr> ... </tr> </table>
XML 디스플레이
- xml 파일을 그냥 브라우저에서 보면, 브라우저 별로 다르게 보인다.
- 소스보기를 하면 원래 파일의 내용을 볼 수 있다.
- xml 파일에 오류가 있으면 오류를 표시하기도 하고, 아무것도 안보이기도 한다.
- 이렇게 제각각으로 보이는 것은 XML에 표시에 관한 아무런 정보도 없기 때문이다.
- CSS 를 이용해서 보이는 방법도 있지만, 추천되는 방법은 아니다.
- 사례 : CD 목록 XML 파일 해당 CSS 파일 CSS파일을 사용해 포매팅한 결과
- JavaScprit나 XSLT 를 이용하는 것이 좋다.
XML HttpRequest
- 대부분의 최신 브라우저는 서버로부터 데이터를 요청하는 XMLHttpRequest 오브젝트가 있다. 이를 사용하면 다음과 같은 장점이 있다.
- 페이지를 새로 부르지 않고 페이지를 갱신할 수 있음
- 페이지가 전송된 후 데이터를 전송하고 수신할 수 있다.
- 백그라운드로 서버에 데이터를 송신할 수 있다.
- 자세한 내용은 이 블로그의 글을 참조
XML 해석기
- 대부분의 브라우저는 XML 해석기(parser)가 내장되어 있음. 아래와 같이 사용가능
<script>
var text, parser, xmlDoc;
text = "<bookstore><book>" +
"<title>Everyday Italian</title>" +
"<author>Giada De Laurentiis</author>" +
"<year>2005</year>" +
"</book></bookstore>";
parser = new DOMParser();
xmlDoc = parser.parseFromString(text,"text/xml");
document.getElementById("demo").innerHTML =
xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
</script>
- XMLHttpRequest 객체는 XML 해석기가 내장되어 있음
- responseText 프로퍼티는 string 형식의 응답이 들어있음
- responseXML 프로퍼티에는 XML 형식의 응답이 들어 있음
XML DOM
- DOM(Document Object Model)은 플랫폼/언어 중립적 인터페이스로서, 이를 통해 프로그램이나 스크립트에서 문서의 내용과 구조, 스타일을 동적으로 접근/갱신할 수 있다.
- HTML이나 XML을 트리구조로 표현
- getElementById() 등의 함수를 이용해 접근가능
XML 과 XPath
- XPath는 XSLT 표준의 중요 요소이다.
- XPath는 XML 문서에서 엘리먼트와 속성을 방문하는데 사용된다.
- XPath는 XML 문서의 부분을 정의하는 문법이다.
- XPath는 XML 문서를 방문하기 위한 경로표현식(path expression)을 사용한다.
- XPath는 표준 함수의 라이브러리를 포함한다.
- XPath는 W3C에서 추천한다.
- XPath는 경로 표현식(Path Expression)을 사용하여 XML 문서의 노드를 선택한다. 이 경로표현식은 컴퓨터 파일시스템의 경로와 비슷한 형태이다.
- XPath는 JavaScript, Java, XML Schema, PHP, Python, C, C++ 등 많은 언어에서 사용된다.
- XSLT에서도 사용된다. XPath를 알면 XSL을 잘 활용할 수 있다.
- 예제
- /bookstore/book[1] -> bookstore 엘리먼트의 자손들중 첫번째 book 엘리먼트 선택
- /bookstore/book[last()-1) -> ... 끝에서 두번째 엘리먼트 선택
- /bookstore/book[postion()<3] -> ... 처음 두개의 엘리먼트 선택
- //title[@lang='en'] -> "lang" 속성이 "en"인 모든 title 엘리먼트 선택
- //bookstore/book[price>35.00]/title -> price 엘리먼트의 값이 35.00보다큰 모든 book 엘리먼트의 title 엘리먼트를 선택하라.
- XPath 투토리얼
XML 과 XSLT
- XSLT는 XML 문서를 HTML로 변환하는데 사용한다.
- XSLT(eXtensible Stylesheet Language Transformations)는 XML을 위한 추천 스타일시트 언어
- CSS 보다 훨씬 복잡함. XSLT를 사용하면 출력 파일로부터 엘리먼트나 속성을 추가/제거할 수 있음 재배열, 정렬도 가능하고, 테스트도 가능, 어떤 요소를 숨길지 표시할지 결정할 수 있음
- XSLT는 XPath를 사용하여 XML 문서에서 정보를 찾아냄
- XSLT 투토리얼
XML과 XQuery
- XQuery는 SQL로 데이터베이스를 검색하는 것과 같은 역할을 한다.
- XQuery는 XML데이터를 query할 수 있도록 설계되었다.
- 예제 : SQL과 비슷하다.
for $x in doc("books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title
- XQuery란
- XML 데이터를 qurey 하기 위한 언어
- SQL : 데이터베이스 = XQuery : XML
- XQuery는 XPath 표현식을 기반으로 한다.
- XQuery는 중요한 Database에서 지원한다.
- XQuery는 W3C에서 추천한다.
- XQuery로 할 수 있는 일
- Web서비스에서 정보추출에 사용
- 요약 보고서 생성
- XML 데이터를 XHTML로 변환
- 웹 문서에서 관련 정보를 검색
- W3C의 추천
- XML, 네임스페이스, XSLT, XPath, XML Schema 등과 같은 W3C 표준과 호환된다.
- XQuery 1.0은 2007년에 W3C의 추천으로 등록됨
- XQuery Tutorial
XML 과 XLink. 그리고 XPointer
- XLink는 XML 문서에서 하이퍼링크를 생성하는데 사용한다.
- XML 문서중 모든 요소를 링크처럼 만들 수 있다.
- XLink를 사용하면 링크가 문서 바깥에 존재한다.
- WLink는 W3C에서 추천
- XML 문서에 대한 XLink를 지원하는 브라우저는 없다.
- 하지만, 중요 브라우저는 모두 SVG에서 XLink를 지원한다.
- XLink 문법
- HTML에서는 <a> 태그로 하이퍼링크를 만들지만, XML에서는 어떤 엘리먼트는 사용할 수 있으므로, 어떤 요소이름이 하이퍼링크가 될지 알 수 없다.
- 아래와 같은 방식으로 XLink를 만든다.
- XLink기능을 사용하려면 XLink 네임스페이스를 선언해야 한다.
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xlink:type , xlink:href 속성은 XLink 네임스페이스에서 온 것이다.
- xlink:type="symple" 을 사용하면 HTML 형식의 링크를 만들 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<homepages xmlns:xlink="http://www.w3.org/1999/xlink">
<homepage xlink:type="simple" xlink:href="https://www.w3schools.com">Visit W3Schools</homepage>
<homepage xlink:type="simple" xlink:href="http://www.w3.org">Visit W3C</homepage>
</homepages>
- XPointer
- XPointer를 사용하면 XML 문서 특정부분에 링크를 생성할 수 있다.
- XPointer는 XPath 표현식을 사용하여 XML 문서를 방문한다.
- XPointer는 W3C 추천.
- XPointer의 브라우저 지원
- XPointer를 지원하는 브라우저는 없다. 하지만, 다른 XML 언어에서는 사용된다.
XML Validator
- XML 문법 체크
- root 요소가 반드시 존재해야 한다.
- 모든 요소는 끝태그가 있어야 한다.
- 모든 태그는 대소문자 구분
- XML 요소들이 올바르게 중첩되어야 한다.
- 속성 값은 반드시 "따옴표"로 묶어야 한다.
- XML 의 경우 절대 오류가 있어서는 안된다!!!
XML DTD
- 문법에 맞는 XML 문서는 "Well Formed"라고 함
- DTD에 대해 검증받은 XML 문서는 "Well Formed" 하며 "Valid" 함
- 아래에서 !DOCTYPE 선언이 외부파일 Note.dtd를 참조하고 있음
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<body>Don't forget this weekend!</body>
</note>
<!DOCTYPE note ->root 엘리먼트
[
<!ELEMENT note (to, from, body)> -> note 요소는 반드시 to, from, body 요소를 포함해야 함
<!ELEMENT to (#PCDATA)> ->to 요소는 "#PCDATA" 유형이어야 함.
<!ELEMENT from (#PCDATA)> -> #PCDATA란 parse-able text data (파싱 가능한 텍스트)
<!ELEMENT body (#PCDATA)>
]>
- DOCTYPE은 특수문자를 정의하는데 사용할 수도 있음
- <!ENTITY writer "Writer: Donald Duck."> 이렇게 정의한 뒤
- <body> &writer;</body> 라고 사용하면 이 부분이 위 정의로 대체된다.
- DTD/schema를 사용하면
- 여러 그룹들이 표준 DTD를 사용하여 자료교환 가능
- 외부에서 받은 데이터가 유효한지 확인할 수 있음
- DTD로 자신의 데이터도 확인할 수 있음
- 다만, 아직 추천사항도 아니고, XML의 요구조건도 아니므로, 구지 사용할 필요 없음.
- DTD Tutorial 참고
XML Schema
- XML Schema는 XML 문서의 구조를 설명함
- XML Schema는 XML 기반으로 DTD 대체.
<xs:element name="note"> -> note라는 요소를 정의함
<xs:complexType> -> note는 complex 유형임
<xs:sequence> -> 이 complex 유형은 요소들이 나열된 형태임
<xs:element name="to" type="xs:string"> ->"to" 요소는 string 유형임
<xs:element name="from" type="xs:string">
<xs:element name="body" type="xs:string">
</xs:sequence>
</xs:complexType>
</xs:element>
- XML Schema는 DTD보다 훨씬 강력하다.
- XML Schema 자체가 XML로 작성됨
- 쉽게 추가할 수 있음
- datatype을 지원함
- 네임스페이스를 지원함
- XML Schema를 사용해야 하는 이유
- 해당 XML 파일에 대한 설명을 제공
- 여러 그룹에서 표준으로 자료교환 가능
- 데이터 검증이 가능
- XML이 데이터유형을 지원한다는 것은??
- 문서 내용을 쉽게 설명할 수 있다.
- 데이터의 정확성을 쉽게 검증할 수 있다.
- 데이터 제한사항을 쉽게 정의할 수 있다.
- 다른 유형으로 쉽게 변환할 수 있다.
- XML Schema는 XML 문법을 사용한다. 따라서
- 새로운 언어를 배울 필요 없고
- XML 에디터로 스키마 파일을 편집할 수 있고
- XML parser로 스키마 파일을 해석할 수 있고
- XML DOM으로 처리할 수 있으며
- XSLT로 자료를 변환할 수 있다. 아주 좋은 점이 많다는 말씀. DTD를 쓰는 건 말이 안됨.
- XML Schema Tutorial 을 참고할 것
XML Server
- XML 파일은 단순한 텍스트 파일. 웹서버로 저장/생성하기 쉽다.
- PHP로 생성하는 것도 어렵지 않고. (다만 header("Content-type: text/xml")로... 지정해야 한다.
- asp로 생성하는 것도 물론 가능하고
- Database로부터 생성할 수도 있다.