공간정보/표준

XML 투토리얼 W3C

하늘이푸른오늘 2017. 12. 24. 12:06

이 글은 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">
  • 특수문자는... 
    • &lt;    &gt;    &amp;   &apos;   &quot;
  • 코멘트는 
    • <!-- 이렇게 하면 코멘트 -->
  • 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'>
  • 따옴표 내에 따옴표 있을 경우, 다른 것을 사용하던지 &quot;를 사용
  • 무엇을 속성으로 할지, 엘리먼트로 할지는 정해진 것이 없음. 편한대로. 정보도 동일함
  • 되도록이면 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 를 이용해서 보이는 방법도 있지만, 추천되는 방법은 아니다.

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로부터 생성할 수도 있다.

XML 예제 파일들