- 시작은 문자(letter)나 밑줄(_) 혹은 콜론(:)
- 그 뒤는 문자, 숫자, 하이픈(-), 밑줄, 콜론, 마침표 등을 임의로 조합
- XML의 문자는 유니코드를 의미하므로 한글이름도 가능.
(그러나 브라우저와 파서의 유니코드 지원 여부는 별개의 문제.)- XML, XMl, XmL, xML, Xml, xMl, ..., xml라는 세 문자로 시작해서는 안됨
XML은 고도의 구조적 문서이기 때문에
정형성(well-formed)을 준수해야 한다.
정형 문서란 다음의 규칙을 따르는 문서를 말한다.
- 문서의 시작에 XML 선언이 있어야 한다.
- 모든 요소는 시작 태그와 마침 태그를 가지고 있어야 한다.
단, 데이터가 없는 요소는 />로 끝나는 하나의 태그만을 사용할 수 있다.- 문서는 다른 모든 요소를 포함하는 루트(root)요소라고 하는 유일한 요소를 갖는다.
- 요소는 다른 요소를 둘러쌀 수 있지만, 중첩될 수 없다.
- 모든 속성 값은 인용부호(" ")로 둘러싸여야 하며, 인용부호 내에 <, &, ', " 같은 기호는 사용불가
정형 문서(well-formed Document) 예제
<?xml version="1.0" encoding="EUC-KR" ?> : 아래의 예에서 XML 문서의 선언부분은 생략<hi> Hello, XML!</hi> | (well-formed) |
<hi> Hello,
world!</hi> <hi> Hello, XML!</hi> |
* 루트요소 없음 |
<xdoc> <hi> Hello, world!</hi> <p /> <hi> Hello, XML!</hi> </xdoc> |
(well-formed) - 태그 두 번 사용해도 상관없음 - 단독으로 사용되는 태그 : <태그명 /> |
Hello XML! | * 요소가 하나도 없다 |
<new><hi>Hello, XML!</new></hi> | * 중첩 규칙 위반 |
<new><hi>Hello, XML!</hi></new> | (well-formed) |
<hi><new>Hello, XML!</new></hi> | (well-formed) |
유효 문서(valid document) : DTD에서 명시한 규칙을 만족하는 정형 문서를
의미
유효성 검증(validating) : XML문서가 DTD에서 정의한대로
올바로 작성되었는지 검사
XML 파서 (parser), XML 처리기 : XML 문서와 관련 파일을 읽어 XML 문서의 정형성 및 유효성을 검사하고, application에게 넘겨줄 문서 트리 구조를 만들어낸다
IE 5.0 에는 비검증용 파서까지 내장, 유효성 검사를 하려면 별도의 파서가 필요
참조 : MSXML 마이크로소프트 제공 XML 파서를 이용하면 된다.
XML에서는 정형 문서가 의미있는 상황이면 DTD를 굳이 포함시키지 않아도 된다.
문서가 마크업되는 방식에
대한 정의를 의미하는 것으로 일종의 스키마(schema)이다.
스키마란 문서의 문법, 어휘,
구조, 데이터형 등을 규정하는 모든 규칙들의 통칭
XML 문서 내용에 대한 정보를 효율적으로 표기할
수 있는 태그를 작성자가 직접 정의할 수 있다.
그러나, 다른 사용자에게도 의미가 있으려면 문서를
작성하는 언어 규칙을
정확히 전달할 수 있어야 한다.
즉, 여러 사람이 서로 호환되는 문서의 작성을 위하여
사용되는 언어 규칙을 명시하는 DTD가 필요
DTD는 XML 문서에서 사용될 다음 사항들을 기술한다.
<?xml version="1.0" encoding="EUC-KR"?> <!DOCTYPE memo [ <!ELEMENT memo (body) > <!ELEMENT body (p+) > <!ELEMENT p (#PCDATA) > ]> <memo> <body> <p> 회의가 내일 오후 2시 예정이니 참석 요망 </p> <p> 회의 참석 여부를 오늘 중으로 회신 요망 </p> </body> </memo> |
문서형식 선언(DOCTYPE): 루트요소
이름 "memo"
memo 요소에 대한 DTD : memo 안에 body가 있다. body 요소에 대한 DTD : body 안에 p가 여러개
있다. p 요소에 대한 DTD : p는 일반문자로
구성된다. |
<?xml version="1.0" encoding="EUC-KR"?> <!DOCTYPE memo ... 위와 동일 ... > <memo> <body> <p> 회의가 내일 오후 2시 예정이니 참석 요망 </p> </body> <body> <p> 회의 참석 여부를 오늘 중으로 회신 요망 </p> </body> </memo> |
* 오류 : memo
안에 body 요소가 두개 있을 수 없다
=> 수정하기 memo (body+) |
<?xml version="1.0" encoding="EUC-KR"?> <!DOCTYPE memo ... 위와 동일 ... > <memo> <body> <p> 회의가 내일 오후 2시 예정이니 참석 요망 </p> </body> <p> 회의 참석 여부를 오늘 중으로 회신 요망 </p> </memo> |
* 오류 : memo 안에 p 요소가 바로
올 수 없다
=> 수정하기 memo (body, p) |
<?xml version="1.0" encoding="EUC-KR"?> <!DOCTYPE memo ... 위와 동일 ... > <memo> <body> </body> <body> <p> </p> </body> </memo> |
* 오류 : body 와 p 요소 안에
내용이 있어야 한다.
=> 수정하기
body (p*) |
<?xml version="1.0" encoding="EUC-KR"?> <!DOCTYPE memo SYSTEM "memo00.dtd" > <memo> <header> <to> <heading> To: </heading> <name> 홍길동 </name> </to> <from> <heading> From: </heading> <name> 장길산 </name> </from> <date> 1999. 4. 15. </date> </header> <body> <p> 회의가 내일 오후 2시부터 시작될 예정으로 있으니 꼭 참석하여 주시기 바랍니다. </p> <p> 회의 참석 여부를 오늘 중으로 제게 알려 주시기 바랍니다. </p> </body> </memo> |
memo 의 구성은 header 와 body header 의 구성은 to, from, date to 의 구성은 heading 과 name from 의 구성은 heading 과 name heading, name, date 는 일반문자 body 의 구성은 여러개의 p body 의 속성 remark는 일반문자, 생략가능 p 는 일반문자 |
<!ELEMENT memo (header, body) > <!ELEMENT header (to, from, date) > <!ELEMENT to (heading, name) > <!ELEMENT from (heading, name) > <!ELEMENT heading (#PCDATA) > <!ELEMENT name (#PCDATA) > <!ELEMENT date (#PCDATA) > <!ELEMENT body (p*) > <!ATTLIST body remark CDATA #IMPLIED > <!ELEMENT p (#PCDATA) > |
예제 :(General Entity), (Parameter Entity)
<?xml
version="1.0" encoding="EUC-KR"?> <!DOCTYPE memo [ <!ENTITY hong "홍길동, 숙명여대"> <!ENTITY sblim "<entry> <name>임순범</name> <tel>02-710-9424</tel> <email href='sblim@sookmyung.ac.kr'/> </entry>"> ]> <memo> <header> <to> To: &hong; </to> <from> From: &sblim; </from> </header> <body>회의가 내일 있으니 꼭 참석하시기 바랍니다. </body> </memo> |
<!ELEMENT address-book (entry+)> <!ELEMENT entry (name, addr, tel*, email*)> ... <!ELEMENT tel (#PCDATA)> <!ATTLIST tel preferred (true | false) "false"> <!ELEMENT email EMPTY> <!ATTLIST email href CDATA #REQUIRED preferred (true | false) "false"> ... |
<!ENTITY %
bool '(true | false)
"false" '> <!ELEMENT address-book (entry+)> <!ELEMENT entry (name, addr, tel*, email*)> ... <!ELEMENT tel (#PCDATA)> <!ATTLIST tel preferred %bool;> <!ELEMENT email EMPTY> <!ATTLIST email href CDATA #REQUIRED preferred %bool;> ... |