본문 바로가기
PROGRAM/XML

XML 스타트..

by 반화넬 2008. 1. 22.
반응형

XML이란 무엇인가?

·                                 XML EXtensible Markup Language 약자이다.

·                                 XML HTML 매우 흡사한 markup language이다.

·                                 XML 데이터를 기술하기 위해 고안되었다.

·                                 XML 태그들은 XML에서 미리 정의되어 있지 않다. 필요한 태그는 본인이 정의를 해야만 한다.

·                                 XML 자기기술적(self describing) 특성을 갖고 있다.

·                                 XML 데이터를 기술하기 위해 공식적으로 DTD(Document Type Definition) 사용한다.


XML HTML 주요 차이점

XML HTML 대치물이 절대 아니다.
XML
HTML 서로 다른 목표 가지고 고안되었다:

XML 데이터가 무엇인지(what data is) 초점을 맞춰 데이터를 기술하기 위해 고안되었다.
HTML
데이터가 어떻게 보일지(how data looks) 초점을 맞춰 데이터를 표시하기 위해 고안되었다.

HTML 정보를 표시하기 위한 언어이고, XML 정보를 기술(describing)하기 위한 언어이다.


XML 확장성

HTML 문서를 만들기 위한 태그나 HTML 문서의 구조는 이미 정의되어 있다. HTML 문서를 만드는 사람은 HTML 표준에서 정의된 태그들만 사용할 있다.

XML 자신의 문서 구조 자신의 태그 정의할 있도록 해준다.


XML HTML 상호 역할

XML HTML 대치물이 아니라는 사실을 이해하는 것은 상당히 중요하다. 향후 개발에 있어서 XML 데이터를 기술하고 구조화 시키는데 사용될 것이며 HTML 동일한 데이터를 표시하고 꾸미기 위해 사용될 것이다.


XML 미래

XML 생겨난 이후로 놀라울 정도의 속도로 XML 표준이 발전되어 왔으며 소프트웨어 벤더들도 상당히 빠른 속도로 XML 표준으로 삼고 있다.

XML 향후 HTML 만큼이나 웹의 근간이 것이다. 또한 XML 웹을 통한 데이터 전송 데이터 처리의 표준으로 자리 잡을 것이다.

 

·                                 XML HTML 별도로 데이터를 보관할 있다

·                                 XML HTML 문서 내부에 데이터를 저장할 수도 있다

·                                 XML 정보 교환의  방식으로 사용될 있다.

·                                 XML 파일 또는 데이터베이스에 데이터를 저장할 있다


XML HTML 별도로 데이터를 보관할 있다

HTML 페이지는 데이터를 표시하기 위해 사용된다. 데이터는 종종 HTML 페이지 내부에 저장된다. XML에서는 데이터를 별도의 XML 파일에 저장할 있다. 이렇게 함으로써 HTML 하여금 데이터를 표시하고 꾸미는 것에 집중할 있도록 해준다. 또한 이렇게 함으로써 기본이 되는 데이터가 바뀌더라도 HTML 전혀 수정할 필요가 없어지게 된다.


XML HTML 문서 내부에 데이터를 저장할 수도 있다

XML 데이터는 HTML 페이지 내부에도 데이터를 격리시켜 저장할 있다. 여전히 HTML 데이터를 표시하는 것에 집중시킬 있다.


XML 정보 교환의 방식으로 사용될 있다

대부분의 시스템, 데이터베이스는 서로 호환되지 않는 데이터 포맷을 포함하고 있다. 대부분의 개발자들은 인터넷 상에서 서로 호환되지 않는 데이터를 주고 받기 위해 많은 시간을 낭비하고 있다. 만일에 정보 교환할 데이터를 XML 바꿔준다면 많은 시간을 절약할 있으며 서로 다른 애플리케이션 사이에서도 데이터 교환이 가능해진다.


XML 파일 또는 데이터베이스에 데이터를 저장할 있다

XML 해당 데이터를 파일이나 데이터베이스에도 저장할 있다. 이런 데이터를 저장하고 읽어 들이기 위해 별도의 애플리케이션을 개발할 있다. 물론 이런 데이터를 표시하기 위한 애플리케이션을 만들기도 한다.

 

 

XML 문서의  :

<?xml version="1.0"?> <note> <to>철수</to> <from>다니엘</from> <heading>기억할 것!</heading> <body>이번 주 약속 잊지말길!</body> </note>

번째 라인부터 살펴 보도록 하자. 부분은 XML 선언부 반드시 포함시켜야 하는 부분이다. 부분은 사용된 문서의 XML 버전을 정의한 부분이다. 경우 XML 1.0 스펙을 따른다는 것을 의미한다:

<?xml version="1.0"?>

다음 라인은 문서의 번째 요소(element) 정의한다( 부분은 최상위 요소(root element)):

<note>

다음 4 라인은 최상위 요소의 자식 요소(child elements) 4개를 정의하는 부분이다(to, from, heading body):

<to>철수</to> <from>다니엘</from> <heading>기억할 것!</heading> <body>이번 주 약속 잊지말길!</body>

마지막 라인은 최상위 요소의 끝을 정의하는 부분이다:

</note>

 


모든 XML 요소는 마침 태그(closing tag) 가져야 한다

HTML에서는 마침 태그(closing tag) 필요 없는 요소들도 있었다. 다음은 HTML에서 문제가 없는 코드이다:

<p>이것은 하나의 문단이다
<p>
이것은 또 다른 문단이다

하지만 XML에서는 다음과 같이 마침 태그를 반드시 가져야 한다:

<p>이것은 하나의 문단이다</p> <p>이것은 또 다른 문단이다</p> 

 


XML 태그는 대소문자 구분이 있다

XML 태그들은 대소문자 구분을 한다. 태그 <Letter> 태그 <letter> 서로 다르다.

그러므로 시작 태그와 마침 태그는 반드시 대소문자를 맞춰줘야 한다:

<Message>이렇게 하면 잘못된 것이다</message>

 

<message>이렇게 해야 맞다</message>

 


모든 XML 요소는 중첩 원리를 지켜야 한다

HTML에서 어떤 요소들은 다음과 같이 서로 부적절하게 중첩될 있었다:

<b><i>이 문장은 볼드체와 이탤릭체로 나타난다</b></i>

하지만 XML에서는 다음과 같이 서로 중첩을 시켜줘야 한다:

<b><i>이 문장은 볼드체와 이탤릭체로 나타난다</i></b>

 


모든 XML 문서는 최상위 요소를 가져야 한다

모든 XML 문서는 쌍의 최상위 요소 태그를 포함해야 한다. 모든 다른 요소들은 최상위 요소 하부로 중첩되어야 한다. 모든 요소들은 자신의 하부로 자식 요소들을 가질 있으며 모든 요소들은 시작 태그와 마침 태그의 쌍을 정확히 이뤄야 한다. 또한 모든 하위 요소들은 자신의 부모 밑에서 순서를 지켜 중첩되어 있어야 한다:

<root> <child> <subchild> </subchild> </child> </root>

 


속성 값은 쿼테이션(' 또는 ")으로 감싸줘야 한다

XML 요소들은 HTML에서와 마찬가지로 name value 속성을 가질 있다. XML에서 속성 값은 항상 쿼테이션(' 또는 ")으로 감싸줘야 한다. 아래 개의 XML 문서를 보면, 번째 것은 틀렸고, 번째 것은 맞았다. 어떤 부분이 맞고 틀렸는지 살펴보기 바란다:

<?xml version="1.0"?> <note date=12/11/99> <to>철수</to> <from>다니엘i</from> <heading>기억할 것</heading> <body>이번 주 약속 잊지말길!</body> </note>

 

<?xml version="1.0"?> <note date="12/11/99"> <to>철수</to> <from>다니엘i</from> <heading>기억할 것</heading> <body>이번 주 약속 잊지말길!</body> </note>

 

XML 속성(Attributes)

XML 속성(Attributes) 보통 XML 요소를 설명하기 위해 또는 요소에 대한 부가 정보를 제공하기 위해 사용된다. HTML에서 다음과 같은 내용을 보면 쉽게 있을 것이다: <IMG SRC="computer.gif">. 예에서 SRC IMG 요소의 속성이다. SRC 속성은 IMG 요소에 대한 부가 정보를 제공해주는 역할을 한다.

속성은 언제나 요소의 시작 태그 안에 포함되어 있어야 한다. 다음은 예이다:

HTML : <img src="computer.gif"> <a href="demo.asp">

XML : <file type="gif"> <person id="3344">

대부분 속성은 XML 문서 내용에 포함되어 있지 않은 정보를 제공하기 위해 사용된다. 말을 다른 말로 표현하자면, 속성은 종종 독자들에게보다는 XML 해석하는 해석기(파서, parser)에게 중요하다. 어쨋든 위의 예에서 person id 독자들과는 상관 없는 숫자이지만 person 요소를 처리할 소프트웨어에게는 상당히 중요한 의미를 가진다는 것이다.


요소(element) 속성(Attributes) 사용

다음 예를 살펴 보자:

성별 구분을 위해 "속성"을 사용하는 방법: <person sex="female"> <firstname>다니엘</firstname> <lastname></lastname> </person> 성별 구분을 위해 "요소"를 사용하는 방법: <person> <sex>female</sex> <firstname>다니엘</firstname> <lastname></lastname> </person>

번째 예에서 sex 속성이다. 번째 예에서 sex 요소이다. 가지 모두 독자들에게는 같은 정보를 제공한다.

데이터를 기술하기 위해 "요소" 사용해야 할지 "속성" 사용해야 할지에 대한 특별한 규칙은 없다. 하지만 경험에 비추어보면, HTML에서는 "속성" 사용하는 것이 간편하고 XML에서는 "요소" 데이터를 표현할 있다면 "속성" 사용을 피해야 한다.

다른 예를 살펴 보자. 예는 "속성" 대신 어떻게 "요소" 사용하는지에 대한 것이다. 예에 포함된 3개의 문서는 모두 동일한 정보를 갖고 있다. 번째 문서에서는 date "속성"이고 번째 문서에서는 date "요소"이며 번째 문서에서는 date 확장된 "요소"이다:

<?xml version="1.0"?> <note date="12/11/99"> <to>철수</to> <from>다니엘</from> <heading>잊지말 것!</heading> <body>이번 주 약속 잊지말길...</body> </note>

<?xml version="1.0"?> <note> <date>12/11/99</date> <to>철수</to> <from>다니엘</from> <heading>잊지말 것!</heading> <body>이번 주 약속 잊지말길...</body> </note>

<?xml version="1.0"?> <note> <date> <day>12</day> <month>11</month> <year>99</year> </date> <to>철수</to> <from>다니엘</from> <heading>잊지말 것!</heading> <body>이번 주 약속 잊지말길...</body> </note>

 


"속성" 사용을 피하는 이유

"속성" 사용을 피해야 하는가? "속성" 사용하게 되면 다음과 같은 문제점들이 있다:

·                                 "속성" 여러 개의 값을 가질 없다 ("요소" 가능하다)

·                                 "속성" 확장되기가 어렵다 (향후 변경시)

·                                 "속성" 구조를 기술할 없다 ("요소" "자식요소" 사용할 있다)

·                                 "속성" 이용해 프로그래밍 하기가 어렵다

·                                 "속성" 값은 DTD 대해 시험하기가 쉽지 않다

만일 XML 데이터를 보관하기 위해 "요소" 대신 "속성" 사용하기 시작하면 유지하기도 어렵고 데이터를 처리하기도 어려워진다. 여기서 계속 얘기하고자 하는 것은 데이터를 기술하기 위해서는 "속성" 대신 "요소" 사용하라는 것이다. "속성" 독자와는 상관 없는 정보를 제공할 경우에만 사용하길 바란다. 다음과 같은 사용은 자제해 주기 바란다:

<?xml version="1.0"?> <note day="12" month="11" year="99" to="철수" from="다니엘" heading="잊지말 것!" body="이번 주 약속 잊지말길..."> </note>

 


속성을 사용하는 다른 경우

"속성" 독자와는 상관 없는 정보를 제공할 경우에만 사용하라고 하였는데 외에 다음과 같은 경우에도 사용할 있다:

XML 문서에서 어떤 요소에 접근하기 위해 ID 할당하는 경우가 있다. HTML에서 NAME이나 ID 속성을 사용하는 경우와 동일하다. 다음 예를 한번 보자:

<?xml version="1.0"?> <messages> <note ID="501"> <to>철수</to> <from>다니엘</from> <heading>잊지말 것!</heading> <body>이번 주 약속 잊지말길...</body> </note> <note ID="502"> <to>다니엘</to> <from>철수</from> <heading>Re: 잊지말 것!</heading> <body>그래 알았어!</body> </note> </messages>


예에서 ID 어떤 데이터가 아니라 XML 파일에 있는 note 요소들을 구분하기 위한 유니크한 식별자이다. 예에서 말하고자 하는 것은 메타데이터(metadata, 데이터를 정의하기 위한 데이터) 저장할 때는 "속성" 사용하고 데이터 자체를 저장할 때는 "요소" 사용하라는 것이다.

출처-코리아인터넷닷컴

 

DOM(Document Object Model)

DOM HTML XML 문서를 연결시켜주는 프로그래밍적 인터페이스이다. DOM 어떤 XML 문서를 열고 XML 데이터를 처리할 있는 방법을 정의하고 있다.

DOM 이용하면 개발자는 XML 문서를 만들 있고, XML 문서 구조를 내비게이션할 있으며, 요소들을 추가/수정/삭제할 있다.

DOM 중요한 목적은 아주 다양한 환경과 애플리케이션에서 사용할 있는 표준적인 프로그래밍 인터페이스를 제공하는 것이다.

W3C DOM 어떠한 프로그래밍 언어로도 개발될 있도록 고안되었다.


노드(Node) 인터페이스

다음 장에서 살펴보겠지만 XML 문서를 읽어들이기 위해 XML 파서(XML Parser, XML 해석기)라고 불리는 프로그램이 사용될 것이다. 문서가 메모리로 올라오면 Document Object Model (DOM) 통해 XML 문서의 정보를 읽고 조작할 있게 된다.

DOM XML 문서 구조를  트리 형식으로 나타낸다. documentElement 트리의 -레벨이다. 요소는 하나 또는 이상의 자식 노드(childNodes) 가진다. 자식 노드는 트리의 가지로 보면 된다.

노드 인퍼페이스(Node Interface) XML 노드 트리의 요소를 읽고 쓰기 위해 사용된다. 각각의 노드를 접근하기 위해 documentElement childNodes 속성을 접근할 있다.

Microsoft XML parser 인터넷 익스플로러에서 DOM 입증하기 위해 사용된다. 파서는 노드 트리를 탐색하고, 노드와 노드의 속성 값에 접근하고, 노드의 추가/삭제, 노드 트리를 XML 바꾸는 등의 모든 필요한 기능들을 지원한다.

Microsoft XML parser 모든 입증된 기능은 공식적인 W3C XML DOM 권고안 따른다.

Microsoft XML parser 현재 전체 13개의 노드 타입을 지원한다. 가장 많이 사용되는 노드 타입은 다음 표와 같다:

노드 타입(Node Type)

Document type

<!DOCTYPE food SYSTEM "food.dtd">

Processing instruction

<?xml version="1.0"?>

Element

<drink type="beer">Carlsberg</drink>

Attribute

type="beer"

Text

Carlsberg

DOM 관련 예제를 보려면 Microsoft Internet Explorer 5.0 이상을 사용해야 한다!

 


XML 파서(parser) 이용하기

XML 문서를 읽고, 수정하고, 생성하고, 조작하려면 XML 파서가 필요하다. Microsoft XML parser Microsoft Internet Explorer 5.0 이상과 함께 나오는 COM 요소이다. 일단 IE 5.0 이상을 설치하면 HTML 문서나 ASP 파일에서 스크립트를 이용할 있다.

Microsoft XMLDOM parser 언어 중립적인 프로그래밍 모델이다:

·                                 JavaScript, VBScript, Perl, VB, Java, C++ 이외의 언어 지원

·                                 W3C XML 1.0 XML DOM 지원

·                                 DTD validation 지원

만일 IE 5.0 이상에서 자바스크립트를 이용한다면 다음과 같이 XML 문서 개체를 생성할 있다:

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")

만일 VBScript 사용한다면 다음과 같이 XML 문서 개체를 생성할 있다:

set xmlDoc = CreateObject("Microsoft.XMLDOM")

만일 ASP에서 VBScript 사용한다면 다음과 같이 XML 문서 개체를 생성할 있다:

set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")


XML 문서 파서로 읽어들이기

다음 코드는 기존 XML 문서(여기서는 note.xml) XML 파서로 읽어들이는 예이다:

<script language="JavaScript">

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")

xmlDoc.async="false"

xmlDoc.load("note.xml")

// ....... 나머지 스크립트 처리

</script>

제일 먼저 XMLDOM 개체의 인스턴스를 만들고 note.xml이란 문서를 파서로 하여금 읽어들이게 한다. xmlDoc.async="false" 부분은 문서를 완전히 읽을 때가지 실행을 중지할 것을 의미한다.

 직접 실습해 보기


순수 XML 텍스트를 파서로 읽어 들이기

다음 코드는 텍스트 문자열을 XML 파서로 읽어들이는 예이다:

<script language="JavaScript">

 

var text="<note>"

text=text+"<to>철수</to><from>다니엘</from>"

text=text+"<heading>기억할 것</heading>"

text=text+"<body>이번 주 약속 잊지말 것!</body>"

text=text+"</note>"

 

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")

xmlDoc.async="false"

xmlDoc.loadXML(text)

// ....... 나머지 스크립트 처리

</script>

load 메소드 대신 loadXML 메소드를 사용하고 있음을 주목하기 바란다.

 


parseError 개체

만일 XML 문서를 연다면 XML 파서는 에러를 발생할 수도 있다. parseError 개체를 사용하면 정확한 에러 코드, 에러 이유, 에러가 발생한 라인 등을 얻을 있다.


파일 에러

아래 예는 XML 파서로 하여금 존재하지 않는 파일을 읽어 들이게 에러에 대한 정보를 보여주는 것이다:

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")

xmlDoc.async="false"

xmlDoc.load("ksdjf.xml")

 

document.write("<br>Error Code: ")

document.write(xmlDoc.parseError.errorCode)

document.write("<br>Error Reason: ")

document.write(xmlDoc.parseError.reason)

document.write("<br>Error Line: ")

document.write(xmlDoc.parseError.line)

 직접 테스트


XML 에러

아래 예는 XML 파서로 하여금 "well formed" 문서가 아닌 XML 문서를 읽어들이게 발생하는 에러를 살펴보는 것이다. ("well formes" 문서에 대한 자세한 설명은 "XML 기초 다지기 - 유효성" 부분을 읽어 보기 바란다)

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")

xmlDoc.async="false"

xmlDoc.load("note_error.xml")

 

document.write("<br>Error Code: ")

document.write(xmlDoc.parseError.errorCode)

document.write("<br>Error Reason: ")

document.write(xmlDoc.parseError.reason)

document.write("<br>Error Line: ")

document.write(xmlDoc.parseError.line)

 직접 테스트 또는 XML 문서 열어 보기


parseError 속성

속성

설명

errorCode

long integer형의 에러 코드를 반환

reason

에러에 대한 이유를 설명하는 문자열 반환

line

long integer형의 에러가 발생한 라인 반환

linePos

long integer형의 에러가 발생한 위치 반환

srcText

에러를 일으킨 라인을 포함을 문자열 반환

url

열린 문서의 URL 반환

filePos

long integer 형으로 에러의 파일 포지션 반환

 

노드 트리 탐험

XML 문서에서 XML 요소를 얻어오는 가장 흔한 방법은 노드 트리를 순회하여 요소의 텍스트 값을 얻어 오는 것이다. 어떻게 하는지에 대한 예를 들기 위해 VBScript for/each문을 사용하였다.

다음은 XML 노드 트리를 탐험하여 브라우저에 XML 요소를 표시하는 VBScript 코드이다:

set xmlDoc=CreateObject("Microsoft.XMLDOM")

xmlDoc.async="false"

xmlDoc.load("note.xml")

 

for each x in xmlDoc.documentElement.childNodes

  document.write(x.nodename)

  document.write(": ")

  document.write(x.text)

next

 직접 테스트 또는 CD 카타로그 테스트


Providing HTML content from XML files

XML 사용하는 가장 이유 중의 하나가 HTML 문서에서 데이터 부분을 분리하기 위함이다. 브라우저에 내장된 XML 파서를 사용함으로써 XML 문서에 있는 데이터를 자바스크립트로 접근하여 HTML 파일 내에 표시할 있게 된다.

아래 예는 자바스크립트를 이용하여 XML 데이터를 읽어들인 HTML 요소에 대입하는 예이다:

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")

xmlDoc.async="false"

xmlDoc.load("note.xml")

 

nodes = xmlDoc.documentElement.childNodes

 

to.innerText = nodes.item(0).text

from.innerText = nodes.item(1).text

header.innerText = nodes.item(2).text

body.innerText = nodes.item(3).text

 직접 테스트


이름으로 XML 요소 접근하는 방법

아래 예는 자바스크립트로 XML 데이터를 읽은 HTML 요소에 대입하는 예이다. 요소의 이름을 통해 XML 데이터에 접근하는 것을 있을 것이다:

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")

xmlDoc.async="false"

xmlDoc.load("note.xml")

 

document.write(xmlDoc.getElementsByTagName("from").item(0).text)

 

페르소마(timecrysis)
반응형