-
xml 강의 정리...프로그램/XML 2008. 3. 27. 17:17
결론은 제일 마지막에 써 놨다.
XML 문서는 DTD 포함 여부에 따라서 Well-formed 문서와 Valid 문서로 나누어진다.Well-formed 문서는 잘 구성되어있다.라는 뜻
XML 스펙을 보면 XML 문서가 갖추어야 할 조건들을 설명하고 있는데
그 조건을 잘 지키고 있다면 Well-formed 라고 함Valid 문서는 기본적인 조건에 무언가를 하나 더 지키고 있다는 것이다.
이것이 바로 DTD(Document Type Definition)라는 것인데 문서의 타입을 정의하는 것을 말한다.DTD를 보통 Document Type Definition 이라고 하는데
Document Type Declaration 은 무엇인가?
이것은 XML 문서 내에서 <DOCTYPE> 요소를 사용해 DTD 문서를 선언하는 것을 말한다.즉, XML 문서가
<xml version='1.0'>
<DOCTYPE aaa system..>
<aaa>
이런 형태로 되어 있을때, <DOCTYPE>으로 선언한 부분을 "Document Type Declaration"이라고 하는 것이다.<?xml version="1.0" encoding="euc-kr"?>
<?xml:stylesheet type="text/xsl" href="메모.xsl"?>
<!DOCTYPE 메모 SYSTEM "메모.dtd" >
<메모>
<헤더>
<송신자>&me;</송신자>
<수신자>홍길동</수신자>
<수신자>이순신</수신자>
<날짜>
<년>2000</년>
<월>12</월>
<일>9</일>
</날짜>
<제목>XML의 기본개념 과 활용방안</제목>
<키워드>XML</키워드>
<키워드>문서구조</키워드>
<키워드>DTD</키워드>
</헤더>
<텍스트>
<내용>
이글은 XML과 관련된 연재입니다. 다음과 같은 차례로 이루어져 있습니다.
</내용>
<목록 타입="도형">
<항목>XML이란?</항목>
<항목>XML 문서의 처리 - 엘리먼트, 속성, 엔터티..</항목>
<항목>XML, XSL 그리고 웹브라우저</항목>
<항목>XML 응용 분야 및 발전 가능성</항목>
</목록>
</텍스트>
</메모>
풀이!!
<?xml version="1.0" encoding="euc-kr"?>
XML 선언이라는 부분이다. version 이란 현재 XML 스펙 1.0을 지원한다는 것이고
encoding 은 사용할 언어를 지정한다는 의미이다.
euc-kr이나 ksc5601로 지정하면 한글을 사용할 수 있다.<?xml:stylesheet type="text/xsl" href="메모.xsl"?>
<? ... ?> 이런 형태로 사용되는 것을 PI라고 부른다. 우리말로는 처리명령이라고 한다.
가장 많이 사용될 PI 인데 스타일쉬트를 지정하는 것이다.
XML 에서는 문서의 구조를 나타내는 부분과 포매팅(보여주는 부분)이 서로 다르다.
바로 포메팅을 담당하는 것을 가르키는 부분이다.
만약 이부분을 빼고 문서를 IE에서 볼 경우
특정 포맷이 정해지지 않았기에 그냥 문서의 내용이 보여진다.<!DOCTYPE 메모 SYSTEM "메모.dtd" >
DTD를 포함하고 있는 문서는 Valid 문서이다 라고 설명했다.
그러한 DTD를 지정하는 부분이다.
이 부분이 바로 "Document Type Declaration"이다.
간단히 의미를 해석하자면 System 즉, Local PC에 있는 메모.dtd란 파일을 DTD정의로 사용하고,
그 메모.dtd의 루트 엘리먼트가 "메모"라는 것이다.엘리먼트란 XML 문서에서 <메모><헤더><텍스트> 같은 것들이다.
이것은 <메모>(시작태크) 와 ..</메모>(닫는 태그) 로 구성되어 있다.<메모>와 같이 가장 먼저 사용될 엘리먼트를 루트 엘리먼트라고 한다.
HTML 에서는 <html> 이 루트 엘리먼트 이다.<송신자>&me;</송신자>
<송신자> 엘리먼트의 내용이 &me;라고 되어 있습니다. 이걸 엔터티 참조라고 한다.
엔터티는 XML에서 좀더 복잡하고 다양하게 사용되지만
일단 간단한 문자열 대치정도로 생각하자.<목록 타입="도형">
여기에서 타입="도형"이란 부분이 있다.
이것을 속성 노드라고 한다.
"타입"은 속성이름이고 "도형"은 속성값이 된다.
HTML에서 < a href="xmlis.pe.kr">이 부분을 생각하면 금방 이해하실 수 있을 것이다.HTML에서는 닫는태그를 빼먹어도 별 문제가 안되지만
XML에서는 이러한 태그가 빠진다면 에러로 인식하게 됩다.반드시 모든 엘리먼트는 쌍으로 이루어져야 한다는 것이다.
그렇다면 <br>, <img>와 같이 혼자서 존재할 수 있는 엘리먼트는 어떻게 해야 할까?
XML 스펙에 따르면 위와 같은 것들은 엘리먼트 내에 내용을 포함하지 않은 것으로서
빈 엘리먼트 (Empty Element)라고 한다.
이러한 빈 엘리먼트의 표기법은
- <br></br>
- <br/><img src="xml.gif"/>와 같은 표현을 볼 수 있을 것이다.
마지막으로 엘리먼트에서 고려해야 할 사항은
시작태그와 끝태그의 엘리먼트 이름이 같아야 한다는 것입니다.
만약 다음과 같이 엘리먼트가 사용되었다면 잘못된 것입니다.
<head>XML Developer</tail><img src="xml.gif"/>
<img>태그를 살펴보면, <img>태그는 그림을 나타내고
그림의 소스는 xml.gif라는 것을 우리는 알 수 있다.
만약 <img/>와 같이 혼자만 사용되었다면 아무런 의미를 가질 수 없게 될 것이다.
HTML에서 처럼 이와 같은 것을 속성이라고 부른다.
엘리먼트는 속성을 포함할 수 가 있는 것이다.
속성이 없었다면 <img>태그를 다음과 같이 표현할 수도 있을 것입니다.
<img>
<src>xml.gif</src>
<align>center</align>
</img>
그러나 속성을 활용하면 <img src="xml.gif" align="center"/>과 같은 형태로 나타낼 수 있다.속성에서 주의해야 할 것이 HTML 에 다음과 같은 표기법이 허용되어 있습니다.
<img src=xml.gif>
하지만 XML 문서에서는 반드시 ' 또는 " 로 둘러쌓여 있어야 합니다.
그렇지 않은 경우 Well-formed 한 문서가 되지 못 한다.
항상 <img src="xml.gif"> 형태로 사용되어저야 한다.
또는 <img src='xml.gif'> 로 사용해야 한다.처리명령(Processing Instruction)
<? 와 ?> 사이에 표현되고 특정 응용 프로그램에 대해 처리 할 정보나 명령을 가르키는 역활을 합니다.
대표적으로 XSL을 선언하는 부분을 예로 들자면
<?xml:stylesheet type="text/xsl" href="메모.xsl"?>
위와 같이 적용되면
XML의 스타일쉬트를 지정하고 타입은 text/xsl 이며 소스는 메모.xsl에 있다.
라고 해석 할 수 있는 것이다. 이렇게 해석할 수 있도록 제공하는 것을 처리명령이라고 한다.
<?xml version="1.0"?>
와 같은 것도 처리명령이라고 할 수 있습니다. 여기서는 xml 버전 1.0을 사용한다고 가리키고 있다.그런데 xml에서는 이와 같은 것을 특별히 xml 선언이라고 부른다.
모든 xml 문서의 시작은 xml 선언으로 해야 한다.xml의 구성요소를 추가로 보자면
Enitity
<> & 와 같은 것들을 HTML 에서 여러번 보았을 것이다. 이것은 각각 < > & 를 나타낸다.
만약 DTD 문서에 다음과 같이 선언이 되어 있다면
<!ENTITY xml "eXtensible Markup Language">
이것을 XML 문서 내에서 사용할 때에는 &xml; 과 같이 사용한다.
그럼 XML 프로세서는 &xml; 이부분을 eXtensible Markup Language 로 변환하여 사용하게 됩다.
또한 엔터티는 이미지와 같은 Binary 데이터나 비 ASCII 문자를 대체하기 위해서도 사용된다고 한다.
entity는 범위도 넓고 개념이 어려워서 설명하기 난해하다.주석(Comment)
주석은 <!-- --> 사이에 정의된다.
CDATE 섹션(CDATA Section)
모든 문자를 마크업이나 테그로 인식하지 않고 일반 문자로 인식하도록 할 수 있는 표기법입니다.
예를 들면 <greeting>Hello World</greeting>과 같은 형태로 사용하면 이것은 하나의 <greeting> 이라는 엘리먼트가 된다.
이 엘리먼트의 내용이 Hello World 가 된다.하지만 이 전체를 문자열로 사용하고 싶다면
<![CDATA[
<greeting>Hello World</greeting>
]]>이렇게 사용하면 <greeting>Hello World</greeting> 를 모두 문자열로 인식하게 된다.
XSL 과 같은 문서에 자바스크립트를 사용할 때 CDATA 섹션을 많이 사용하게 된다.
<?xml version="1.0"?>
<html>
<head>
XML Developer
</head>
<body>
<img src="xml.gif"/>
<a href="http://xmlis.pe.kr">Hello World</a>
</body>
</html>엘리먼트를 선언하는 형식은 <!ELEMENT 이름 내용>
이름은 사용될 엘리먼트의 이름을 나타내고 내용은 자식으로 나타낼 수 있는 것들을 적어준다.
<body> 태그를 DTD에서 정의한다고 했을 경우...
이름은 body 가 되고 <body> 와 <body> 사이에 나타나는 것을 적어준다.
그것이 바로 자식으로 나오는 것인데 위에 보면 <img> 태그와 <a> 태그가 나타나고 있다.<body><img...><img...><a...><img...></body>
뭐 이런형태로 나올수 있다고 가정할 경우.. DTD 선언은 다음과 같이 할 수 있습니다.이름 : body
내용 : img 또는 a가 여러번 발생 <!ELEMENT body (img|a)*>
| 엘리먼트 내용이 선택적으로 나타날 수 있다.
, 엘리먼트 내용이 순서대로 나타나야 한다.
? 엘리먼트 내용의 출현회수가 생략되거나 한번 나타난다.
* 엘리먼트 내용의 출현회수가 생략되거나 여러번 나타난다.
+ 엘리먼트 내용의 출현회수가 최소 한번 이상 나타난다.
엘리먼트 내용의 출현회수가 한번만 나타난다.
다음 예로 <head>와 같은 걸 선언한다고 했을때...head의 내용은 그냥 문자열이다.
XML 에서는 이러한 것을 #PCDATA 라고 부른다.
단순 문자열로 XML 문서를 읽을 때 파싱 된다는 의미를 갖고 있다.이름 : head
내용 : #PCDATA 가 한번만 출현한다. <!ELEMENT head (#PCDATA)>
XML에서 <img>와 같은 태그는 내용을 포함하지 않는 엘리먼트라고 했다.
빈 엘리먼트(Empty Element)이다.
내용이 없는데 <img>는 어떻게 정의할 수 있을까?? <!ELEMENT 이름 EMPTY>
적용시켜 보면
<!ELEMENT img EMPTY>속성의 선언
DTD에서 속성을 선언하는 방식은 다음과 같다.
<!ATTLIST 엘리먼트이름 속성이름 속성형 (속성기본값)>엘리먼트이름은 속성을 포함할 엘리먼트의 이름을 나타내고
속성이름은 속성의 = 왼족에 나타나는 이름이다.
속성형은 속성이 가질 수 있는 타입이고, 속성 기본 값은 속성의 필요여부등을 나타낸다.속성형 선언형태 설 명
문자열 속성 CDATA 일반적인 문자열
토큰 속성 ID 엘리먼트의 ID
IDREF 엘리먼트의 ID를 가리키는 포인터
IDREFS 하나이상의 IDREF들
ENTITY 외부 엔터티를 가리키는 포인터
ENTITIES 하나 이상의 엔터티 값들
NMTOKEN 토큰 문자열
NMTOKENS 하나 이상의 토큰 문자열들
열거 속성 (값1 | 값2 | 값3 | ...) 선택 가능한 값을 목록으로 나타냄속성의 기본값 설명
#REQUIRED 속성값이 반드시 필요한 속성이다.
#IMPLIED 속성값이 지정되지 않은 경우 XML 프로세서가 암시적으로 할당한다.
#FIXED 속성값이 DTD에 지정된 값과 반드시 같아야 한다.
위에서 <img>태그가 있었습니다. <img>태그의 src 속성을 선언한다고 해보죠..엘리먼트이름 : img
속성이름 : src
속성형 : 문자열 속성 (CDATA)
속성기본값 : 필요함
<!ATTLIST img src CDATA #REQUIRED>
결론
1. cds.xsl 는 문서의 형식을 정해주는 틀 같은 소스다.<xsl:template match="/">
</xsl:template>
<xsl:template match="compactdisc">
<FONT SIZE="2">
음악가 : <xsl:value-of select="artist"/>
</FONT><BR/>
</xsl:template><xsl:template match="/"> 이문장에서
match="/" 는 루트 엘리먼트를 만나면 xsl:template 로 처리하고</xsl:template>
이 문장을 만나면 xml 문서의 형식을 종료 하라는 것이다.
2. cds.xml 파일은 그 상세 내용을 정의 한 소스다.<?xml version="1.0"?>
<!DOCTYPE compactdiscs SYSTEM "cds.dtd">
<?xml:stylesheet type="text/xsl" href="cds.xsl"?>
<compactdiscs>
<compactdisc>
<artist type="individual">Frank Sinatra</artist>
<title numberoftracks="4">In The Wee Small Hours</title>
<tracks>
<track>In The Wee Small Hours</track>
<track>Mood Indigo</track>
<track>Glad To Be Unhappy</track>
<track>I Get Along Without You Very Well</track>
</tracks>
<price>$12.99</price>
</compactdisc>
</compactdiscs>상세 내용을 xsl화면에 맞춰서 내보내게 된다.
3. cds.dtd 파일은 xml 파일을 어떤 형식으로 작성해야 하는지를 정의 한 파일이다.<!ELEMENT compactdiscs (compactdisc*)>
<!ELEMENT compactdisc (artist, title, tracks, price)>
<!ENTITY % Type "individual | band">
<!ELEMENT artist (#PCDATA)>
<!ATTLIST artist type (%Type;) #REQUIRED>
<!ELEMENT title (#PCDATA)>
<!ATTLIST title numberoftracks CDATA #REQUIRED>
<!ELEMENT tracks (track*)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT track (#PCDATA)>
내용에 따르면 artist 는 타입이 필요하고 문자열이 들어간다.
title은 numberoftracks 가 꼭 들어가야 한다...
이런 내용이 담긴 파일이다.'프로그램 > XML' 카테고리의 다른 글
web.xml 관련 (0) 2008.04.07 web.xml 패턴 (0) 2008.04.01 XML 이란... (0) 2007.11.13