Programming
IT업계에서 가장 자주 쓰이는 말중의 하나로 XML을 빼놓을 수 없습니다. 도데체 XML이란 무엇일까요?

XML이란 Extensible Markup Language약자로 확장 Markup언어를 의미합니다. 대표적인 Markup언어로 HTML이란 것이 있습니다. Internet Homepage등을 만들때 기본 골격이 되는 언어로서 여기서 쓰이는 <font>나 <table> Tag는 이미 각 Tag마다 그 의미와 용도가 정해져 있습니다. 예를 들어 <font color="red">hello</font>라고 한다면 hello라는 문자열의 표시를 붉은 색으로 지정하겠다는 의미가 되죠.

이때 내가 hello라는 문자열을 빨간색으로 표시하기 위해 <글자 색상="빨간색">으로 임의의 Tag를 정해서 쓰게 되면 결코 hello글자는 붉은색으로 표시되지 않습니다. 그것은 이미 글자의 속성을 변경하기 위해 <font>등의 Tag를 써야한다는 규칙이 정해져 있기 때문입니다.

반면 XML은 Extensible이 의미하듯이 '확장'이 가능한 언어라고 할 수 있습니다. 이는 어떠한 목적을 위해 특정한 Tag만을 써야한다는 개념에서 벗어나 나 자신 스스로가 특정 Tag를 정하고 그 Tag에 의미를 부여하여 사용할 수 있다는 것을 의미합니다.

예를 들어 자동차와 비행기에 대한 정보를 XML을 통해 규정지으려고 할때 자동차를 의미하는 Tag는 무엇을 쓸지 비행기를 의미하는 Tag는 무엇을 쓸지 알아서 정하기만 하면 되는 것입니다.

<?xml version="1.0" encoding="euc-kr"?>
<tran>
 <car>똥차</car>
 <air>보잉747</air>
</tran>

운송수단을 의미하는 Tag로 <tran>태그를 정했으며 여기에 자동차는 <car>로 비행기는 <air> Tag를 정의하였습니다. 이처럼 XML은 어떤 특정한 Tag만을 써야한다는 약속이 없습니다. 부여하고자 하는 Tag를 마음껏 정의하고 사용하기만 하면 되는 것입니다.

이렇게 정의된 XML문서는 보통 확장자를 xml로 해서 문서로 저장하며 작성된 문서를 다른 매체(사람이나 Software등등..)에 전달할때는 각 Tag가 무엇을 의미하는지 그리고 어떻게 처리하면 좋을지에 대한 약속을 정하기만 하면 됩니다.

이는 XML이 어디서든 통하는 범용언어로서의 역활을 하기 때문에 가능한 것입니다. 앞어 말씀드린 HTML과 같은 경우는 Tag가 이미 정해져 있기 때문에 HTML만으로 특정한 정보를 상호간에 전달하기에는 부족한 점이 많을 것입니다.

예를 들어 보겠습니다. 단순히 검은색자동차, 흰색자동차라는 정보를 전달하고 싶지만 HTML은 이 정보를 규정짓는 Tag가 존재하지 않기 때문에 표현이 불가능 합니다. 하지만 XML은 정보를 의미하는 특정한 Tag를 만들어 부여하면 되므로 상호간에 해당 Tag에 대한 정의만 약속되어 있으면 원하는 정보의 전달이 가능하게 됩니다.

1. XML 작성 규칙

XML은 각각의 Tag에 대한 구체적인 정보를 스스로 구현하고 정의할 수 있지만 그렇다 하더라도 작성하는 문법사항까지 무시하고 마음대로 작성할 수는 없습니다.

문법이라고 해도 어렵거나 그다지 복잡한것은 없으므로 대략적으로만 알아보도록 하겠습니다.

(1) XML문서의 시작시에는 작성되는 XML의 버전과 인코딩정보를 기술합니다.

<?xml version="1.0" encoding="euc-kr"?>

(2) XML문서작성시 전체를 포괄하는 최상위 Tag는 하나만 있어야 합니다.

<?xml version="1.0" encoding="euc-kr"?>
<tran>
 <car>똥차</car>
 <air>보잉747</air>
</tran>
<cyl>
 <auto>뽈뽈이</auto>
</cyl>

최상위 Tag로 <tran>과 <cyl>두개가 있는 형태지만 이러한 형식은 허용하지 않습니다.(단, 하위 Tag는 몇개가 있어도 상관없습니다.)

(3) XML도 HTML과 마찬가지로 시작Tag와 마침Tag가 존재하며 둘은 같이 써야 합니다.

<car>똥차</car>

단 중간에 내용이 없는 Tag일 경우 <car/>형식으로 표현이 가능합니다.(이때 각 Tag는 영문자이외에 숫자로 시작해서는 안되며 <c ar>처럼 공백을 포함할 수는 없습니다.)

(4) XML도 HTML과 같이 각 Tag에 속성을 부과할 수 있습니다.

<?xml version="1.0" encoding="euc-kr"?>
<tran>
 <car age="old">똥차</car>
 <air>보잉747</air>
</tran>

car Tag에 age라는 속성이 부과되었으며 속성값으로 old라는 값을 지정하였습니다.

(5) 각 Tag는 대문자와 소문자를 구분합니다.

<car></car><Car></Car><CAR></CAR>

<car>와 <Car>, <CAR> Tag는 모두 관련이 없는 완전 별개의 Tag입니다.

(6) HTML에서 쓰던 특수문자(&nbsp;, &amp;등등)표현식은 그대로 사용할 수 있습니다.

<?xml version="1.0" encoding="euc-kr"?>
<tran>
 <car age="old">똥차&amp;</car>
 <air>보잉747</air>
</tran>


XML문서를 Web Brawser를 통해 확인합니다.

(7) 주석은

2. XML의 Namespace

위에서 XML작성시 <car> Tag는 자동차를 의미하는 것으로 사용한다고 가정해 보겠습니다. 이때 다른 사람도 자신의 XML문서를 작성하면서 Card라는 것을 의미하는 <car> Tag를 정의할 수 있을 것입니다. 즉, 같은 Tag를 전혀 다른 사람이 전혀 다른 의미와 용도로 사용할 수 있는 가능성이 존재하는 것입니다.

이런 중복되는 상황을 피하기 위해 XML Tag를 정의한 사람이 누구인지에 대한 이름표를 붙일 수 있는 기능이 있습니다. 그것이 바로 Namespace입니다. (참고로 .net Programming에서도 Namespace라는 것이 있는데 둘다 거의 비슷한 의미를 갖고 있습니다.)

Namespace는 해당 Tag의 xmlns속성을 통해 정의하며 대부분 XML문서의 가장 처음부분에 위치하도록 합니다.

<car xmlns="이름">똥차</car>

이때 "이름"이라는 속성값 마저도 중복되는 내용으로 쓸 가능성이 존재할 것입니다. 예를 들어 "이름"을

xmlns="홍길동"

으로 했다면 동명이인인 사람이 역시 같은 이름인 "홍길동"을 사용할 수 있기에 "이름"에 해당하는 내용은 중복되지 않을 만한 값으로 기술해야 합니다.(주민등록번호나 Internet 주소등)

<car xmlns="http://cliel.com/">똥차</car>

3. DTD(Document Type Definition)

특정 회사의 각 부서명과 해당 부서에서 근무하는 사원수를 정의한 XML문서를 작성한다고 가정해 보겠습니다.

<?xml version="1.0" encoding="euc-kr"?>
<compy>
 <dept>
  <name>관리부</name>
  <cont>3</cont>
 </dept>
 <dept>
  <name>경리부</name>
  <cont>2</cont>
 </dept>
 <dept>
  <name>기술부</name>
  <cont>5</cont>
 </dept>
</compy>

<compy>를 기준으로 <dept>에 의해 각 부서를 나누고 해당 부서의 이름과 사원수를 기록합니다.

그런데 이 문서가 한 사람이 아닌 여러사람에 의해 관리된다면 <name>을 <names>라고 한다던가 아니면 <dept>하위에 <customer>이라는 엉뚱한 Tag를 집어넣등의 관리적 오류가 발생할 가능성이 있습니다.

이때 XML문서에서는 DTD라는 것을 설정하여 위와 같은 문제를 피할 수 있습니다. DTD는 XML문서를 구성하고 있는 각 Tag를 명확히 정의함으로써 틀린 구문이 작성되면 이를 허용하지 않도록 하기 위한 것입니다.

XML에서 DTD는 다음과 같이 XML문서가 시작되기 전에 먼저 기술하여 각 Tag가 어떻게 쓰여야 하는지 나타내도록 합니다.

<?xml version="1.0" encoding="euc-kr"?>
<!DOCTYPE rule [
 <!ELEMENT compy (dept+)>
 <!ELEMENT dept (name, cont)>
 <!ELEMENT name (#PCDATA)>
 <!ELEMENT cont (#PCDATA)>
]>
<compy>
 <dept>
  <name>관리부</name>
  <cont>3</cont>
 </dept>
 <dept>
  <name>경리부</name>
  <cont>2</cont>
 </dept>
 <dept>
  <name>기술부</name>
  <cont>5</cont>
 </dept>
</compy>

rule라는 이름으로 이 XML문서의 형식을 정의하였습니다. 이 형식에 의하면 compy는 dept라는 하위 Tag로 구성되며(compy (dept*)) dept Tag는 다시 name과 conf Tag로 구성됨을(dept (name, cont))정의하고 있습니다.


물론 DTD가 정의 되었다고 해서 위 규칙에 벗어나는 형식으로 XML작성하면 오류가 발생하거나 쓰기 자체를 금지하지는 않습니다. 다만 이 XML문서가 어떤 형식으로 이루어져 있는지를 알려줌으로 인해 상호간 XML형식을 맞출 수 있도록 약속을 하는 것이죠.

3. XML InfoSet

InfoSet은 일종의 개념이다. XML문서를 이루는 요소에서 중요한게 무엇인가를 의미하는 것인데 XML문서가 이 개념만 맞추고 있으면 모두 정상적인 XML문서로 가정합니다.

예를 들어

<?xml version="1.0" encoding="euc-kr"?>
<compy>
 <dept>
  <name>관리부</name>
  <cont>3</cont>
 </dept>
 <dept>
  <name>경리부</name>
  <cont>2</cont>
 </dept>
 <dept>
  <name>기술부</name>
  <cont>5</cont>
 </dept>
</compy>

이러한 XML을

<?xml version="1.0" encoding="euc-kr"?><compy><dept><name>관리부</name><cont>3</cont></dept>
 <dept><name>경리부</name><cont>2</cont></dept><dept><name>기술부</name><cont>5</cont></dept></compy>

위와 같은 형태로 바꿔도 무방합니다. 공백은 XML을 이루는데 중요한 요소가 아니며 형식에 위배되지도 않는 것입니다.

'Programming' 카테고리의 다른 글

정규표현식  (0) 2012.05.18
ANSI 문자 코드표  (0) 2011.02.25
XML을 써보자  (0) 2010.12.31
변수명및 메소드(Method)등 명명 규칙  (0) 2010.12.21
0 0