잘 구성된 XML 문서 만들기


IT Story/Database이야기 2010.10.28 15:35



잘 구성된 XML 문서 만들기

 

shakeJ 

HTML의 경우 백개 정도 요소가 미리 정의가 되어 있다.

브라우저에서는 웹 페이지의 HTML을 검사하고 화면에 표시하게 된다.

 

그러나, 이 XML에서는 더욱 많은 자유가 주어진다.

당연히, 자신이 구성요소를 직접 정의하며, 사용하는 방식들도 모두 정해주기 때문이다. 매우 자유로운 형식을 가지고 있긴 하지만, 재사용이 가능하도록 하기 위해서는 여러 규칙을 따라야 한다.

 

HTML 보다 훨씬 더 염격한 규칙을 가지고 있다. XML처리기가 XML 문서가 완벽히 이해하지 못하면 어떠한 처리도 하지 않기 때문이다. (저번 실습시간에 봤듯이 하나라도 틀리게 되면 아예 처리를 하지 않는다)

 

때문에 XML은 잘 구성되어야(well-formedness)해야 하며, 유효해야 한다는 (validity) 두가지 제한 조건이 있다

 

W3C(World Wide Web Consortium) 기구에서는 잘 구성되었는지의 여부를 더 기본적인 제한조건으로 생각한다. 이는 잘 구성되지 않은 XML 데이터 개체는 XML문서라고 부를 수도 없다고 해 놓았다.

W3C는 HTML 해왔던 기능들을 XML처리기에서는 하지 못하는 규정을 만들었다. 이유는 HTML 버전이 여러 개 생겨버렸기에, 이런 것을 통합하기 위해서 XML에서 그러한 규정을 만들었다.

 

W3C?

정부단체가 아니라, 여러 회원들이 모인 하나의 그룹, 미국의 MIT/LCS, 유럽의 INRIA, 이롭ㄴ의 케이오대학 등이 주관하고 있다. 웹의 표준을 게시하게 된다.

 

그렇다면 어떤 문서가 잘 구성된 XML 문서인가 ?

 

-"well-formed"의 조건

자체적으로 라벨로 구성되는 산출물 규칙을 따라야 한다.

이 규격에 주어진 잘 구성된 문서의 제한조건을 만족시켜야 한다.

문서내의 참조할 수 있는 엔티티들이 잘 구성되어야 한다.

 

그렇다면 '엔티티'는 무엇인가?

 

엔티티란, XML 문서의 각 부분이며, 이들은 텍스트나 데이터를 저장할 수 있는 부분이다. XML에서 데이터 저장 단위로 알려진 일방적인 방식이라고 할 수 있다.

예를 들어보면,

 

<?xml version = "1.0"?>

으로 시작하는 부분은

이 문서가 xml로 작성되어 있으며, 현재 사용할 수 있는 1.0 버전을 사용하고 있음을 이야기 하고 있다. 외부 엔티티를 포함이나 참조하지 않는 경우에는

<?xml version = "1.0" standalone="yes" ?>

로 설정해 주면 된다.

이렇게 해주고, 루트요소를 추가 해 주게 된다

 

<?xml version = "1.0" standalone="yes"?>

<DOCUMENT>

<CUSTOMER>

…    

</CUSTOMER>

<CUSTOMER>

</CUSTOMER>

</DOCUMENT>

이렇게 DOCUMENT 사이에 CUTOMER라는 고객란을 만들 수 있다.

 

 

 

 

 

<DOCUMENT>

<CUSTOMER>

<NAME>

<LAST_NAME> Smith </LAST_NAME>

<FIRST_NAME> Smith </ FIRST _NAME>

</NAME>

<DATE> October 15, 2010</DATE>

</CUSTOMER>

<CUSTOMER>

</CUSTOMER>

</DOCUMENT>

last name 과 first name을 추가 해주었다. 이어서 DATE를 추가하였다

위와 같이 추가해줄 부분을 계속하여 추가하게 되면 CUSTOMER의 요소가 되게 된다.

 

<DOCUMENT>

<CUSTOMER>

<NAME>

<LAST_NAME> Smith </LAST_NAME>

<FIRST_NAME> Smith </ FIRST _NAME>

</NAME>

<DATE> October 15, 2010</DATE>

<ORDER>

<ITEM>

<PRODUCT>Tomatoes</PRODUCT>

<NUMBER>87</NUMBER>

<PRICE>100만원</PRICE>

</ITEM>

</CUSTOMER>

<CUSTOMER>

</CUSTOMER>

</DOCUMENT>

NAME(LASTNAME, FIRSTNAME), DATE, ORDER(PRODUCT, NUMBER, PRICE)이 한 명의 고객 정보가 되어 입력되게 된다.

 

 

마크업과 문자데이터란 ?!

XML 문서는 마크업과 문자데이터로 구성된다.

 

문서의 마크업 = 구조를 정의

( 시작 태그, 종료 태그, 엔티티 참조, 주석, DTD 등을 포함한다.)

 

문서데이터 = 문서의 모든 텍스트를 이야기 한다.

조금 더 쉽게 예를 들어 설명하자면,

<?xml version="1.0" encoding="UTF-8"?>

<DOCUMENT>

<GREETING>

안녕하십니까!!!!!!!!!!!!!!

</GREETING>

<MESSAGE>

지금은 XML 스터디중입니다!!!!!!!!!!!!

</MESSAGE>

</DOCUMENT>

 

+마크업 문서데이터

라는 예제를 보면, 태그는 무조건 "<"">"으로 끝나게 된다. 때문에 쉽게 빨간색으로 되어있는 것들은 모두 마크업이라고 보면 된다.

마크업(이 예제에선 태그)을 제외하고 보면 '안녕하십니까'와 '지금은 XML 스터디중입니다'의 경우에는 문서데이터로 볼 수 있다.

 

무조건 < >이 있다고 해서 마크업이라는 법은 없다. 일반적인 엔티티 참조는 &로 시작해서 ;로 끝날 수도 있으며(&nbps;) DTD에 사용되는 파라미터 엔티티 참조의 경우엔 %로 시작하여 ; 으로 끝나기도 한다.

 

EX) 파싱이 될 때 엔티티 참조가 문자데이터로 바뀌게도 되는데,

일부 마크업이 문서를 처리 할 때 &gt;이라는 마크업은 파싱 될 때 "<"로 바뀌게 된다.

&lt, gt등 인텔리 센스에도 나오게 된다. 마크업이지만 파싱 시 <>으로 문자 데이터화 된다. 이는 결과적으로 '파싱된 문자 데이터'라고 부르게 된다

 

 

공백 WhiteSpace

말 그대로 공백이다.

 

둘의 결과가 똑 같은 것을 볼 수 있다.

 

자 ! 이제 본격적으로 XML 실제 구조와 작동을 알아보자/

 

프롤로그

서문. 이라고 하며, XML의 가장 앞에 나오게 된다. 꼭 필요하진 않지만 최소한의 XML선언을 포함하여 XML버전을 식별할 수 있도록 추천하고 있다. 보통 이 프롤로그에는 XML선언, 주석, 처리문, 공백과 문서 형식의 선언등에 대한 내용을 포함하고 있다.

 

예를들어,

 

<?xml version = "1.0" standalone="yes"?> 다른 외부엔티티를 참조하지않음. 버전.

<?xml-stylesheet type="text/css" href="greeting.css"?> XML 선언. 외부CSS참조

<!DOCTYPE DOCUMENT [ -> DTD선언.

<!ELEMENT DOCUMENT (CUSTOMER)*>

하나씩 알아보자.

XML 선언?

 

반드시 XML선언으로 시작해야 한다.

<?xml version = "1.0" standalone="yes"? encoding="UTF-8">

version : XML버전으로 현재는 1.0만 사용이 가능하다. XML 선언을 사용한다면 이 속성을 반드시 지정해야 한다.

encoding : 문서에 대한 언어 인코딩, 여러가지 기타 문자셋이 가능하다.

standalone : 문서가 외부 엔티티를 참조 하지 않는다면 "yes" 생략이 가능하다.

 

 

 

주석문

 

<!—로 시작하여 -->로 주석을 삽일 할 수 있다.

 

실행화면.

 

1. XML 선언 이전에는 주석을 사용 할 수 없다.

2. 마크업 내부에 주석을 사용 할 수 없다.

3. XML 파서는 –로 해석을 하기 때문에 주석 안에 –을 사용할 수 없다.

4. <MESSAGE>마크업도 주석으로 파서는 해석을 한다.

 

처리문

 

처리문이란 <?xml-stylesheet type="text/css" href="greeting.css"?>

processing instruction으로 처리문은 XML 처리기에 전달하는 명령어라고 할 수 있다.

이들 처리문은 <? ?> 로 사용하게 되며, 한가제 제외 조건은,

<?xml?>은 되지 않는다.

 

<?xml-stylesheet?>은, 스타일시트와 연결시켜 주는 기능을 한다.

 

 

태그와 구성요소

< > 로 끝나는 것들(= 마크업) 이들은 구성요소로 구성된다.

대 소문자를 구분하므로 주의하여야 한다.

    (예를 들어, DOCUMENT, DOCUment, document, dOcuMent 등으로 실제로 사용되는 예도 있다)

 

주의 사항

<2003DOCUMENT>

<.document>

<Record number>

<cum*name>

<Puruc(ID)>

위의 사항들은 모두 XML 파서가 처리하지 못하는 태그들이다.

 

빈 구성요소는 시작과 종료 태그가 아니라 하나의 태그을 사용한다.

예를 들면, <GREETING TEXT="hello frome XML"/>이란 태그는 시작과 종료를 사용하지않는다.

 

* 시작과 종료태그란 <DOCUMENT> </DOCUMENT>와 같이 시작과 종료를 알리는 태그

 

 

루트 구성요소

<?xml version="1.0" encoding="UTF-8"?>

<DOCUMENT>

<GREETING>

안녕하십니까!!!!!!!!!!!!!!

</GREETING>

<MESSAGE>

지금은 XML 스터디중입니다!!!!!!!!!!!!

</MESSAGE>

</DOCUMENT>

<DOCUMENT>루트 요소가 된다.

 

속성

attribute는 시작 태그와 빈태그에서 추가데이터를 지정하는데 사용이 된다.

속성에 값을 지정하려면 등호를 사용한다.

 

<DOCUMENT>

<CUSTOMER STATUS="Good credit">

<NAME>

 

속성 이름

속성 이름은 태그 이름의 규칙을 따라야 한다.

속성 이름은 알파벳, 밑줄, 콜론으로 시작해야 한다.

*********올바른 속성 이름 사용한 예

<circle origin_x="10.0" origin_y="20.0" radius="10.0"/>

<image src="image1.jpg">

<pen color="red" width="5">

<book pages="1231">

*********잘못된 속성 이름 사용한 예

<circle 2origin_x="10.0" 2origin_y="20.0" 2radius="10.0"/>

<image src name="image1.jpg">

<pen color@="red" width@="5">

<book pages(excluding front matter)="1231">

 

속성값

마크업은 항상 텍스트 형태, 속성도 똑같이 항상 텍스트 형태이다.

속성에 숫자를 지정하더라도 숫자들은 텍스트 문자열로 처리되므로, 다음과 같이 인용부호에 포함시켜야 한다.

<circle origin_x="10.0" origin_y="20.0" radius="10.0"/>

 

", '을 혼합하게 사용되는 경우는,

<quotation text='He said, "Not that!"' />

으로 사용하게 된다.

 

유용한 속성!

----------xml:lang

이 속성은 특히 웹 검색 엔진과 같은 소프트웨어를 지원하고 하는 경우, 문서 내용과 속성값에 사용한 언어를 지정하는데 편리하게 사용이 된다.

<p xml:lang="en">This is xml lang을 지원한다</p>

 

그렇다면 이제 잘 구성된 문서구조를 만들어보자

1. XML 선언으로 시작을 한다!

<?xml version="1.0" standalone="yes"?>

 

2. 하나 이상의 구성요소 포함하기

<?xml version="1.0" standalone="yes"?>

<DOCUMENT>

<GREETING>

Halo~

</GREETING>

</DOCUMENT>

 

3, 비어 있지 않은 곳에 시작과 종료 태그를 사용한다.

<?xml version="1.0" standalone="yes"?>

<DOCUMENT>

<GREETING>

Halo~

</GREETING>

</DOCUMENT>

 

4. 내용이 없는 태그는 />로 끝난다.

<?xml version="1.0" standalone="yes"?>

<DOCUMENT>

<GREETING TEXT = "Halo~"/>

</DOCUMENT>

 

5. 루트 요소는 반드시 다른 모드 요소를 포함해야 한다.

<?xml version="1.0" standalone="yes"?>

<DOCUMENT>

<BOOKS>

<BOOK>

</BOOK>

<BOOK>

</BOOK>

</BOOKS>

</DOCUMENT>

 

6. 고유한 속성 이름을 사용한다.

<PERSON LAST_NAME="Wooster" last_name="Jeeves">

<PERSON LAST_NAME="Wooster " LAST_NAME ="Jeeves">

 

위와 같이 대 소문자를 다르게 인식하게 되어 안정적인 코딩이 되기 어렵다.

때문에 속성 이름은 같으면 안되기에 아예 다른 이름으로 설정해주는 것이 좋다.

 

7. 정해져 있는 5개의 엔티티 참조만을 사용 가능하다.

%, <, >, ', " 이렇게 5개만 가능하다.

 

8. 부등호 표시 시에 외부참조를 사용하라.

예를 들어, JavaScript로 부등호로 <를 사용해야 하는 경우에는, XML파서는 < > 로 인식을 하게 되어 오류가 나게 된다. 가라로 주요 브라우저에서 인식하지 못하는 방법을 쓸 수도 있지만, 완전하지 않다. 때문에 js파일을 만들어서 외부참조 하게 되면 문제 없이 가능해 진다

 

CDATA 구역

XML은 매우 <, & 에 민감한데, 이러한 기호가 많이 포함된다면 어떻게 할까 ?

&lt;, &amp;를 사용할수도 있겠지만. 이 경우에는 매우 보기싫고 복잡해 읽기가 힘들어진다. 대신에 CDAT구역을 사용하면 된다.

 

CDATA 구역은 XML처리기에서 파싱되지 않은 문자 데이터를 저장한다. CDATA구역은 이 처리기를 직접 하지않는다. 때문에 이 구역에서 텍스트를 사용 할 수 없기도 하다.

 

<script language="javascript">

<![CDATA[

var budget

budget =234.77

if (budget < 0) {

document.writeln("oh!")

}

]]>

 

XML Namespace

 

Namespace 만들기

루트요소가 BOOK항목인 곳에 의견을 추가하고자 한다.

Namespace는 태그들이 다른 분야의 태그들과 충돌하지 않도록 이름을 넣는 공간을 만들어 주는 것이다. 앞에 붙는 이름만 변경하면 속성, 태그들이 충돌하지 않는다.

:book을 접두어를 사용하여, Namespace를 정의 한다.

 

Namespace를 정의하기 위해서는 "xmls:접두어"형식의 속성으로 만들어 주게 된다.

<library

xmlns:book="http://www.amzingter.com/spec">

 

<!-- 같이 URI(위는 URL)이 인식어가 된다.

이 네임스페이스의 모든 태그와 속성의 앞에는 다음과 같이 book:을 지정해야 한다.

-->

<book:book>

<book:title>

1Q84

</book:title>

</book:book>

</book:library>

또다른네임스페이스를 만들어보자

<!—이제 book이라는 이름의 네임스페이스의 모든태그와 속성이 자체적인 Namespace내에 존재하게 되었다. 이 곳에 또다른 네임스페이스를 만들어보자—>

 

<library

xmlns:book="http://www.amzingter.com/spec"

xmlns:steve="http://www.steve.co.kr">

 

<book:book>

<book:title>

1Q84

</book:title>

<steve:review steve:ID="1000024">

이책은 갠찮다 좋다!!

</steve:rivew>

</book:book>

</book:library>

 

헷갈린다면,

<!—이제 book이라는 이름의 네임스페이스의 모든태그와 속성이 자체적인 Namespace내에 존재하게 되었다. 이 곳에 또다른 네임스페이스를 만들어보자—>

 

<library

xmlns:book="http://www.amzingter.com/spec">

 

<book:book>

<book:title>

1Q84

</book:title>

xmlns:steve="http://www.steve.co.kr">

 

<steve:review

xmlns:steve="http://www.steve.co.kr">

steve:ID="1000024">

이책은 갠찮다 좋다!!

</steve:rivew>

</book:book>

</book:library>

 

 

INFOSET

 

인터넷의 웹문서에서 'XML'을 찾으면 서로 비교되지 않는 XML에 관련된 모든 문서들이 순서없이 비교없이 뜨게 되는데, 이 것은 문서끼리 서로 비호환성 때문이다.

 

때문에 XML에 사람들은 비교기능을 기대 하게 되었다.

서로 호환이 되기 때문이다.

 

Infoset이라고 부르는 XML 정보집합에서는 추상적 방법으로 XML문서를 볼 수 있도록 미리 구성하여 이들을 서로 비교할 수 있다. Infoset을 이용하기 위해서는 잘 구성된 문서이어야 한다. XML정보 집합은 15개 이상의 서로 다른 정보항목을 표함할 수 있다.

 

- 문서 정보항목

- 구성요소 정보항목

- 속성 정보 항목

- 처리문 정보항목

- 건너뛴 엔티티 정보

등등

신고

WRITTEN BY
ShakeJ

0 ,