760 likes | 942 Views
간단한 DTD 작성. Valid XML : DTD 를 만족하는 XML. <?xml version="1.0" encoding= “ euc-kr"?> <memo> <body> <p> 컴퓨터 시스템 구축을 위한 회의가 내일 오후 2 시부터 시작될 예정으로 있으니 꼭 참석하여 주시 기 바랍니다 . </p> <p> 회의 참석 여부를 오늘 중으로 제게 알려 주시 기 바랍니다 . </p> </body> </memo>. 첫번째 문서를 위한 DTD.
E N D
간단한 DTD 작성 Valid XML : DTD를 만족하는 XML
<?xml version="1.0" encoding=“euc-kr"?> <memo> <body> <p> 컴퓨터 시스템 구축을 위한 회의가 내일 오후 2시부터 시작될 예정으로 있으니 꼭 참석하여 주시 기 바랍니다. </p> <p> 회의 참석 여부를 오늘 중으로 제게 알려 주시 기 바랍니다. </p> </body> </memo>
첫번째 문서를 위한 DTD • DTD를 XML 문서에 포함시킬 경우 <!ELEMENT memo (body) > <!ELEMENT body (p+) > <!ELEMENT p (#PCDATA) > <!DOCTYPE 루트 요소명 [ 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>
body와 p 요소를 추가 <?xml version="1.0" encoding=“euc-kr"?> <memo> <body> <p> 컴퓨터 시스템 구축을 위한 1차 회의가 내일 오후 2시부터 시작 될 예정으로 있으니 꼭 참석하여 주시기 바랍니다. </p> <p> 회의 참석 여부를 오늘 중으로 제게 알려 주시기 바랍니다. </p> </body> <body> <p> 컴퓨터 시스템 구축을 위한 2차 회의가 모레 오후 4시부터 시작 될 예정으로 있으니 꼭 참석하여 주시기 바랍니다. </p> <p> 회의 참석 여부를 오늘 중으로 제게 알려 주시기 바랍니다. </p> </body> </memo>
DTD 변경 • 하나 이상의 body 요소가 올 수 있도록 변경된 DTD <!ELEMENT memo (body+) > <!ELEMENT body (p+) > <!ELEMENT p (#PCDATA) >
body와 동일한 수준으로 p 요소 사용 <?xml version="1.0" encoding=“euc-kr"?> <!DOCTYPE memo [ <!ELEMENT memo (body) > <!ELEMENT body (p+) > <!ELEMENT p (#PCDATA) > ]> <memo> <body> <p> 컴퓨터 시스템 구축을 위한 1차 회의가 내일 오후 2시부터 시작 될 예정으로 있으니 꼭 참석하여 주시기 바랍니다. </p> </body> <p> 회의 참석 여부를 오늘 중으로 제게 알려 주시기 바랍니다. </p> </memo>
p 요소가 없는 경우 <?xml version="1.0" encoding="EUC-KR"?> <!DOCTYPE memo [ <!ELEMENT memo (body) > <!ELEMENT body (p+) > <!ELEMENT p (#PCDATA) > ]> <memo> <body> </body> </memo>
확장된 XML 문서 <?xml version="1.0" encoding=“euc-kr"?> <memo> <header> <to> <heading> To: </heading> <name> 홍길동 </name> </to> <from> <heading> From: </heading> <name> 장길산 </name> </from> <date> 2000. 8. 15. </date> </header> <body> <p> 컴퓨터 시스템 구축을 위한 회의가 내일 오후 2시부터 시작될 예정으로 있으니 꼭 참석하여 주시기 바랍니다. </p> <p> 회의 참석 여부를 오늘 중으로 제게 알려 주시기 바랍니다. </p> </body> </memo>
확장된 XML 문서를 위한 DTD <!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 p (#PCDATA) > <!ELEMENT body (p*) >
header 요소를 변경한 DTD <!ELEMENT memo (header, body) > <!ELEMENT header ((to, from, date) | (date, to, from)) > <!ELEMENT to (heading, name) > <!ELEMENT from (heading, name) > <!ELEMENT heading (#PCDATA) > <!ELEMENT name (#PCDATA) > <!ELEMENT date (#PCDATA) > <!ELEMENT heading (#PCDATA) > <!ELEMENT p (#PCDATA) > <!ELEMENT body (p*) >
DTD 작성 연습 <?xml version="1.0" encoding="UTF-8"?> <faq> <info> <subject> XML </subject> <author> 강감찬 </author> <email> kang@janggoon.co.kr </email> <date> 2000. 7. 22. </date> </info> <part> <q> <qtext> What is XML?</qtext> <a> SGML light. </a> </q> <q> <qtext> What can I use it for?</qtext> <a> Anything. </a> </q> </part> </faq>
DTD (Document Type Definition)작성법 DTD는 문서 타입 정의(Document Type Definition)를 나타낸다. DTD는 엘리먼트 , 속성, 표기법, 문서에 포함된 엔터티의 목록 뿐만 아니라 각 요소 간의 관계도 알려준다. 즉, DTD는 문서의 구조에 사용되는 규칙의 집합을 지정한다.
<?xml version=“1.0” encoding=“UTF-8”?> <!DOCTYPE GREETING [ <!ELEMENT GREETING (#PCDATA)> ]> <GREETING> Hello XML! </GREETING > DTD (Document Type Definition)작성법 XML 선언 Document Type Declarations 루트 엘러먼트
DTD (Document Type Definition)작성법 • 첫 번째로 할 일은 루트 엘리먼트를 구분하는 것이다. • <!DOCTYPE memo [ • ]> • 단순히 루트 태그가 memo라는 사실을 알려 준다. • memo 엘리먼트가 무엇을 포함할지, 무엇을 포함하지 • 않을 지지에 관해서는 말하지 않는다.
요소 정의 • 요소 정의 문법 <!ELEMENT 요소명 내용> <!ELEMENT content (#PCDATA)> • 자식 목록 <!ELEMENT memo (content)> <!ELEMENT content (#PCDATA) 각 엘리먼트는 다른 <!ELEMENT> 선언에서 자식으로서 사용되더라도 그 자신의 <!ELEMENT>를 선언에 정확히 한 번은 선언되어야 한다.
요소 정의 SEQUENCE • <!ELEMENT memo (header, body, body)> • 콤마로 분리된 자식 엘리먼트의 목록을 시퀀스라 부른다. • memo 엘리먼트 다음에 정확히 하나의 header 엘리먼트와 • 두 개의 body 엘리먼트가 그 순서대로 나타나야 한다. 하나 혹은 하나 이상의 자식 엘리먼트 • (+) 기호를 추가해서 주어진 엘리먼트를 하나 이상 추가하기 원한다는 것을 나타낼 수 있다. • <!ELEMENT memo (header, body+)> 자식 엘리먼트가 없거나 많이 가지고 있는 경우 • <!ELEMENT memo (header, body*)> 자식 엘리먼트가 없거나 하나일 경우 • <!ELEMENT memo (header, body?)>
요소 정의 선택(CHOICE) : | • 여러 자식 엘리먼트 중 하나의 엘리먼트를 선택할 때 사용 • <!ELEMENT PAYMENT (CASH | CRED_CARD | CHECK)> 괄호가 있는 자식 엘리먼트 • 그룹핑할 때 사용 • <!ELEMENT DOCUMENT (TITLE, SIGNATURE?)> • <!ELEMENT BODY (PARAGRAPH | IMAGE)*> 혼합된 키워드(MIXED CONTENT) • <!ELEMENT TEAM (#PCDATA | CITY | NAME | PLAYER)*> • 콤마, 물음표,프러스 기호 사용 불가 EMPTY 키워드 <!ELEMENT student EMPTY> • <student> </student> or <student />
요소 정의 • <!ELEMENT memo (header, body) > ANY 키워드 <!ELEMENT memoANY> <?xml version=“1.0”?> <!DOCTYPE memo [ <!ELEMENT memo ANY> <!ELEMENT content (#PCDATA)> ]> <memo> <content>좋은 내용</content> 좋은 내용입니다. 좋은 일이 있으시기를… </memo>
요소 생성에 사용되는 기호 • | : OR 조건 • , : 명시된 순서대로 나타남 • ? : 0번 또는 한번 나타남 • * : 0번 또는 한번 이상 나타남 • + : 한번 이상 나타남 • () : 그룹 요소
XML의 데이터 타입 • #PCDATA • parsed character data • <, >, & 기호가 없는 데이터 • 일반적인 마크업 문자 데이터 • 모든 단말 노드는 #PCDATA로 정의 • CDATA • character data • <, >, & 기호가 있는 데이터 • 속성의 내용을 CDATA로 정의
#PCDATA의 문제점 • XML에서는 모든 정보를 #PCDATA로 정의 • 특수한 데이터 타입으로 지정할 수 없음 • 스트링, 정수, 통화 등으로 지정 불가능 • 데이터베이스와 연동시 올바른 데이터인지 검사하는 것을 파서 대신 응용 프로그램에서 담당 • 응용 프로그래머에게 과도한 부담을 줌 • 보다 강력한 데이터 타입을 지원하도록 하자는 제안이 나오고 있음 • 예 : XML Schema를 사용하여 다양한 데이터 타입 지원
CDATA가 포함된 XML 문서 • <![CDATA 로 시작하고 ]]> 로 끝나야 함 • CDATA 문자 데이터 중에 ]]> 이 포함되어 있으면 선언된 것과 다른 결과가 발생할 수 있음 • 주석이 작동되지 않음 <?xml version="1.0" encoding="EUC-KR"?> <doc> <![CDATA[#@^% <<<>>> & <<<<<<< >>>>>>>]]> </doc> <![CDATA[ <?xml version="1.0" encoding="EUC-KR"?> <GREETING> Hello XML! </GREETING> ]]>
DTD 공유하기 • <!DOCTYPE 루트엘리먼트이름 SYSTEM “DTD_URL”> • <!DOCTYPE memo SYSTEM “memo.dtd”> • 원격 URL에 있는 DTD • <!DOCTYPE memo SYSTEM “http://edu.joongang.co.kr/dtd/memo.dtd”> • 현재 디렉토리에 대한 상대 URL 사용 가능 • <!DOCTYPE memo SYSTEM “/xml/dtd/memo.dtd”> • <!DOCTYPE memo SYSTEM “../memo.dtd”>
DTD 공유하기 • 공개 DTD • SYSTME 키워드는 한명의 저작 그룹에 의해 사용되는 개인적인 DTD를 위한 것이다. • 개발 조직 등에서 사용하기 위해 설계된 DTD는 PUBLIC 키워드를 사용한다. • <!DOCTYPE 루트엘리먼트이름 PUBLIC “DTD이름”“DTD_URL”> • PUBLIC은 그 DTD가 널리 사용될 것을 의도하고 만들어졌다는 것을 나타내는 키워드이다. • DTD이름은 이 DTD와 연결된 이름이다. • DTD_URL은 유명한 리파지터리에서 이름을 가지고 DTD를 찾을 수 없을 경우에 DTD를 찾기 위해서 사용되는 절대 URL이나 상대 URL이다.
DTD 공유하기 • DTD 이름 • ISO : ISO 표준 • + : ISO가 아닌 표준기구 • - : 어떤 표준기구에서도 승인하지 않았다. • DTD의 소유자 이름 • DTD가 기술하는 문서의 종류 • 언어속성 • <!DOCTYPE memo PUBLIC • “-//joongang//DTD personal memo//EN” • “http://edu.joongang.ac.kr/dtds/memo.dtd”> • <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML//EN”>
내부DTD 서브셋과 외부 DTD 서브셋 • 특정한 문서가 그 사이트의 다른 페이지와 다른 구조를 가지고 있다면, 그 구조를 독립된 DTD에 정의하는 것보다는 그 문서 자체에 정의하는 것이 더 유용하다. • <?xml version=“1.0”> • <!DOCTYPE document SYSTEM “memo.dtd” [ • <!ELEMENT document (title,memo,signature)> • <!ELEMENT title (#PCDATA)> • <!ELEMENT signature (#PCDATA)> • ]>
XML의 Entity(개체) • XML 문서의 특정한 부분을 담고 있는 저장 단위이다.
XML의 Entity(개체) • Entity(개체) 구분 • 내부 엔터티(Internal Entity) • 외부 엔터티(External Entity) • 일반 엔터티(General Entity) • 파라미터 엔터티(Parameter Entity) • 파싱된 엔터티(Parsed Entity) • 파싱되지 않은 엔터티(Unparsed Entity)
XML의 Entity(개체) • Entity(개체) 구분 • 내부 일반 엔터티 • #PCDATA로 표현하지 못하는 특수 기호 입력 • 같은 문자 데이터를 중복해서 입력하는 수고를 덜어 줌 • (입력하기 힘든 텍스트나 널리 사용되는 텍스트의 생략형)
내부 일반 Entity(개체) 정의 • 내부 일반 Entity(개체) 정의 문법 <!ENTITY 개체명 개체정의> 개체정의는 대체될 문자열이다. • 일반 엔터티(개체) 사용법 &개체명; • 예 <!ENTITY SchoolDept “중앙일보 webmaster”> <!ENTITY hearts "♡">
미리 정의된 일반 엔터티 레퍼런스 선언 • <!ENTITY lt "&#60;"> • <!ENTITY gt ">"> • <!ENTITY amp "&#38;"> • <!ENTITY apos "'"> • <!ENTITY quot """>
내부 일반 Entity(개체) 사용 예 <?xml version="1.0" encoding=“euc-kr"?> <!DOCTYPE memo [ <!ENTITY SD "중앙일보 WEBMASTER"> <!ELEMENT memo (body) > <!ELEMENT body (p+) > <!ELEMENT p (#PCDATA) > ]> <memo> <body> <p> &SD;에서 컴퓨터 시스템 구축을 위한 회의가 내일 오후 2시부터 시 작될 예정으로 있으니 꼭 참석하여 주시기 바랍니다. </p> <p> 회의 참석 여부를 오늘 중으로 &SD;로 알려 주시기 바랍니다. </p> <p> 회의 장소는 &SD; 회의실입니다. </p> </body> </memo>
특수문자 사용 예 <?xml version="1.0" encoding="EUC-KR"?> <!DOCTYPE memo [ <!ENTITY hearts "♡" > <!ENTITY spades "♠" > <!ELEMENT memo (body) > <!ELEMENT body (p+) > <!ELEMENT p (#PCDATA) > ]> <memo> <body> <p> ♥ 컴퓨터 시스템 구축을 위한 회의가 내일 오후 2시부터 시 작될 예정으로 있으니 꼭 참석하여 주시기 바랍니다. </p> <p> ♠ 회의 참석 여부를 오늘 중으로 알려 주시기 바랍니다. </p> </body> </memo>
내부 일반 Entity(개체) 요약 • 모든 엔터티 레퍼런스가 그 값으로 대체된 후에 문서에 대한 검증이 이루어진다. • 텍스트 변경이 용이한 장점이 있다. • 문서들이 하나의 DTD를 공유할 때 유용하다.
XML의 Entity(개체) • Entity(개체) 구분 • 외부 일반 엔터티 • 메인 파일의 밖에 있는 데이타이다. • 여러 독립된 파일로부터 XML 문서를 구축하게 해준다.
외부 일반 Entity(개체) 정의 • 외부 일반 Entity(개체) 정의 문법 <!ENTITY 개체명 SYSTEM “URI”> • 일반 엔터티(개체) 사용법 &개체명;
외부 일반 Entity(개체) 사용 예 <?xml version="1.0" encoding="EUC-KR"?> <!DOCTYPE memo [ <!ENTITY SD "중앙일보 WEBMASTER"> <!ELEMENT memo (body,signature) > <!ELEMENT body (p+) > <!ELEMENT p (#PCDATA) > <!ELEMENT signature (position,name,organization)> <!ELEMENT position (#PCDATA)> <!ELEMENT name (#PCDATA)> <!ELEMENT organization (#PCDATA)> <!ENTITY sig SYSTEM “signature.xml”> ]> <memo> <body> <p> &SD;에서 컴퓨터 시스템 구축을 위한 회의가 내일 오후 2시부터 시 작될 예정으로 있으니 꼭 참석하여 주시기 바랍니다. </p> <p> 회의 참석 여부를 오늘 중으로 &SD;로 알려 주시기 바랍니다. </p> <p> 회의 장소는 &SD; 회의실입니다. </p> </body> &sig; </memo>
외부 일반 Entity(개체) 사용 예 signature.xml <?xml version="1.0" encoding=“euc-kr"?> <signature> <position>Chief </position> <name>Na</name> <organization> Joongang Academy</organization> </signature>
XML의 Entity(개체) • Entity(개체) 구분 • 내부 파라미터 엔터티 • 일반 엔터티는 DTD의 일부가 아니라 문서의 일부분이었다. • 파라미터 엔터티 레퍼런스는 DTD에서만 나타난다. • 파라미터 엔터티 레퍼런스는 퍼센트 기호(%)로 시작한다. • 파라미터 엔터티 레퍼런스는 자식 엘리먼트나 속성을 공유할 때 상당히 유용하다. • 파라미터 엔터티 레퍼런스는 사용되기 전에 선언되어야만 한다. • 파라미터 엔터티 레퍼런스는 외부 DTD 안에서만 나타나야 한다. • 내부 DTD 에서는 선언의 밖에서만 사용될 수 있다.
파라미터 Entity(개체) 정의 • 파라미터 Entity(개체) 정의 문법 <!ENTITY % 개체명 개체정의> 개체정의는 대체될 문자열이다. • 파라미터 엔터티(개체) 사용법 %개체명;
파라미터 Entity(개체) 정의 • 예 • <!ENTITY king “The Great King Alexzander!”> • <!ENTITY word “Our king is &king;”> • <!ENTITY % PCD “(#PCDATA)”> • <!ELEMENT name %PCD;> • <!ELEMENT position %PCD;>
파라미터 Entity(개체) 정의 • 예 • <!ELEMENT paragraph • (person | degree |product | animal | ingredient)*> • <!ELEMENT cell • (person | degree |product | animal | ingredient)*> • <!ELEMENT heading • (person | degree |product | animal | ingredient)*> • <!ENTITY % inlines “(person | degree |product | animal | ingredient)*”> • <!ELEMENT paragraph %inlines;> • <!ELEMENT cell %inlines;> • <!ELEMENT heading %inlines;>
파라미터 Entity(개체) 정의 <?xml version="1.0" encoding=“euc-kr"?> <!DOCTYPE memo [ <!ENTITY % pcd “(#PCDATA)”> <!ELEMENT memo (header, body) > <!ELEMENT header (to, from, date) > <!ELEMENT to (heading, name) > <!ELEMENT from (heading, name) > <!ELEMENT heading %pcd; > <!ELEMENT name %pcd; > <!ELEMENT date %pcd; > <!ELEMENT p %pcd; > <!ELEMENT body (p*) > ]>
파라미터 Entity(개체) 정의 <memo> <header> <to> <heading> To: </heading> <name> 홍길동 </name> </to> <from> <heading> From: </heading> <name> 장길산 </name> </from> <date> 2000. 8. 15. </date> </header> <body> <p> 컴퓨터 시스템 구축을 위한 회의가 내일 오후 2시부터 시작될 예정으로 있으니 꼭 참석하여 주시기 바랍니다. </p> <p> 회의 참석 여부를 오늘 중으로 제게 알려 주시기 바랍니다. </p> </body> </memo>
파라미터 Entity(개체) 정의 <?xml version="1.0" encoding=“euc-kr"?> <!DOCTYPE memo [ <!ENTITY % memo “<!ELEMENT memo (header, body) >”> <!ENTITY % header “<!ELEMENT header (to, from, date) >”> <!ENTITY % to “<!ELEMENT to (heading, name) >”> <!ENTITY % from “<!ELEMENT from (heading, name) >”> <!ENTITY % heading “<!ELEMENT heading (#PCDATA) >”> <!ENTITY % name “<!ELEMENT name (#PCDATA) >”> <!ENTITY % date “<!ELEMENT date (#PCDATA) >”> <!ENTITY % p “<!ELEMENT p (#PCDATA) >”> <!ENTITY % body “<!ELEMENT body (p*) >”> %memo; %header; %to; %from; %heading; %name; %date; %p; %body; ]>
속성이 포함된 DTD <!ELEMENT memo (header, body) > <!ELEMENT header (to, from, date) > <!ELEMENT to (heading, name) > <!ATTLIST to age CDATA #IMPLIED sex (male | female) "male" > <!ELEMENT from (heading, name) > <!ATTLIST from age CDATA #IMPLIED sex (male | female) "male" > <!ELEMENT heading (#PCDATA) > <!ELEMENT name (#PCDATA) > <!ELEMENT date (#PCDATA) > <!ELEMENT p (#PCDATA) > <!ELEMENT body (p*) >
속성이 포함된 XML 문서 <?xml version="1.0" encoding="EUC-KR"?> <!DOCTYPE memo SYSTEM “memo2.dtd"> <memo> <header> <to sex="female"> <heading>To:</heading> <name>홍길동</name> </to> <from age="35"> <heading>From:</heading> <name>장길산</name> </from> <date> 2000.12. 25. </date> </header> <body> <p> 컴퓨터 시스템 구축을 위한 회의가 내일 오후 2시부터 시작될 예정으로 있으니 꼭 참석하여 주시기 바랍니다. </p> <p> 회의 참석 여부를 오늘 중으로 제게 알려 주시기 바랍니다. </p> </body> </memo>
파라미터 Entity를 사용한 DTD <!ENTITY % age_sex 'age CDATA #IMPLIED sex (male | female) "male"' > <!ELEMENT memo (header, body) > <!ELEMENT header (to, from, date) > <!ELEMENT to (heading, name) > <!ATTLIST to %age_sex; > <!ELEMENT from (heading, name) > <!ATTLIST from %age_sex; > <!ELEMENT heading (#PCDATA) > <!ELEMENT name (#PCDATA) > <!ELEMENT date (#PCDATA) > <!ELEMENT p (#PCDATA) > <!ELEMENT body (p*) >