728x90

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 파서로 읽어들이는 예이다:

<s-ript language="JavaS-ript">
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("note.xml")
// ....... 나머지 스크립트 처리
</script>

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

직접 실습해 보기


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

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

<s-ript language="JavaS-ript">

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)

직접 테스트

 

728x90

'WEB' 카테고리의 다른 글

ASP.NET GENERIC  (0) 2012.07.29
XML이란 - 2  (0) 2012.07.29
서버&클라이언트 post&get 방식  (0) 2012.07.29
eval 함수에 값을 할당 할 수 없습니다  (0) 2012.07.29
자바스크립트 파일 쓰기  (0) 2012.07.29

+ Recent posts