본문 바로가기

XML & WebServices

xml dtd

출처 : http://kr.blog.yahoo.com/kwon37xi/1236311.html 

(더 좋은 화면 있습니다.^^;)


DTD ?

  • Document Type Definition - 문서 형 정의
  • DTD 선언은 데이터 안에 포함하거나 별도의 다른 문서로 존재할 수 있다. DTD는 XML 데이터의 구조와
    내용을 나타내는 규칙을 정의한다. 단 하나의 DTD만이 XML 문서와 데이터 객체에 연관될 수 있다.

  • 내부/외부 서브셋
    1. 내부 서브셋 : DTD 선언을 XML 데이터 내부에 포함.
    2. 외부 서브셋 : DTD 선언이 다른 문에서 위치. .dtd 파일
    3. 내부 서브셋에 있는 DTD 선언은 외부 서브셋에 있는 선언보다 우선순위가 높다. 유사한 선언이
      양쪽에 존재할 때, 내부 서브셋의 선언이 사용된다.

XML과 DTD 연결

  • DOCTYPE 선언을 이용한다.
  • XML문서내에 DOCTYPE선언은 단 한번만 나올 수 있다.
  • XML 선언 바로 다음에 나와야 한다.

SYSTEM


  • doc_element란 문서의 root 요소를 의미한다.
  • 내부 서브셋은 선택적이다.
  • SYSTEM 키워드는 DTD의 위치를 명시적으로 가리키는데 사용한다. URL형식을 사용한다.


  • 
    
  • 반드시 파일이나 지정된 URL에 접근 가능한 권한이 있어야만 한다.

PUBLIC

  • PUBLIC 키워드는 내부 시스템과 SGML 애플리케이션에서 사용하도록 제한되어 있다.


  • PUBLIC 위치에서 DTD를 검색하는 것은 DTD를 애플리케이션(파서)이 알아서 찾아서 처리하라는 뜻이다.
  • 보통 PUBLIC 식별자와 함께 SYSTEM 스타일의 위치 지정. PUBLIC 위치를 사용할 수 없을 경우 대체 위치 제공.

PUBLIC 위치에서 DTD를 찾지 못하면 SYSTEM 위치에서 찾는다. SYSTEM 키워드는 내부적으로 암시되어 있다.

내부 서브셋







...


DTD 선언

  • DTD 선언은 형태로 한다.
  • 공백문자는 여러개를 사용해도 된다.
  • 단, 에서 !와 keyword 사이에는 공백이 없다.

DTD 키워드

키워드 설명
ELEMENT XML 요소 형이름과 허가된 하위 요소들(자식)을 기술한다.
ATTLIST XML 요소 속성 이름과 허가된 또는 기본 속성 값을 기술한다.
ENTITY 특별한 문자 참조. 텍스트 매크로, 외부 소스의 반복되는 내용을 기술한다.
NOTATION 외부의 비 XML 내용(예를 들어, 바이너리 이미지 데이터)과 그 내용을 처리하는 외부 애플리케이션 기술.

* ELEMENT, ATTLIST, ENTITY가 핵심이다.

요소 형(ELEMENT) 선언

아래 두 가지 형태의 선언이 있다.


  • name : 요소의 이름.
  • content_category와 content_model은 이 요소가 포함할 수 있는 내용의 종류를 의미한다.

Content Category

어떤 데이타가 올 수 있는가?

Any



  • Well-Formed 인 XML 아무거나 올 수 있다. 유효성 검사를 무력화 시키므로 사용하지 말 것.

Empty



  • 속성 이외에는 아무것도 올 수 없다. HTML의 img 태그 등이 그 예이다.


  • 
    


Content Model



  • 요소 선언에서 내용 모델(Content Model)은 요소 형의 구조와 내용을 기술하기 위해 사용한다.
  • 쉽게 말하면, 요소안에 어떤 다른 요소가 어떤 순서로 몇 개 올수 있는가. 아니면 텍스트만 올 수 있는가 등을 지정한다.
  • 내용 모델은 세가지로 나눌 수 있다.
    1. Text Only : 문자 데이타만 올 수 있다. 자식 요소는 올 수 없다.
    2. Element Only : 자식 요소만 올 수 있다. 자식 외부에 텍스트를 둘 수 없다.
    3. Mixed : 자식 요소와 텍스트 혼합.
  • ANY나 EMPTY 카테고리에서 내용 모델이 필요없다.
  • cardinality 란 내용 모델이 몇개 반복 될 수 있는지 결정하는 것이다.

  • 순차와 선택 리스트
    1. 순차 리스트 : 자식 요소들이 지정된 순서대로 나와야 한다. 자식 요소들의 이름을 구분하기 위해 쉼표(,)를 사용.

      
      
    2. 선택 리스트 : 지정된 자식 요소들 중에서 단 한개만 나타날 수 있다.

      
      

Text-Only(PCDATA)

  • #PCDATA로 지정한다.
    
    

문자열만 올 수 있다.

PCDATA 카테고리를 가진 요소는 실제 데이터와 엔티티 참조만을 허용한다.


어쩌구 저쩌구 메롱~~


Eelement-Only

자식 요소만을 포함한다. 지정된 자식 요소만을 포함할 수 있다. 자식 요소의 외부에 텍스트를 포함할 수 없다.


다음과 같다. 결코 자식요소 외부에 문자열이 올 수 없다.

  haha
  
  some message
  hi~
  


혼합 내용


  • 일반 텍스트와 a_child_element, another_child 요소가 올 수 있다. 카디널리티 연산자로 *를 지정했기 때문에 순서 없이 올 수 있다.

  • #PCDATA 키워드는 사용할 때마다 항상 내용 모델의 첫째 항목으로 나타나야 한다. 그리고나서 자식 요소 형 이름이 나와야 한다.
  • HTML의 body 태그가 대표적인 혼합 내용 요소이다.

순차/선택 리스트 복합 사용


  • Mr, Ms, Dr, Rev 요소 중의 하나만 먼저 나오고 그 다음 FirstName, MiddleName, LastName 이 순서대로 나오고, 다시 Jr, Sr, III 요소 중의 하나만 마지막으로 나올 수 있다.
    
      
      길동
      중간이름도 있나?
      
      
    
    

카디널리티 연산자

  • 카디널리티 연산자는 내용 모델에서 자식 요소들이 얼마나 많이 나타날 수 있는지를 정의한다.
카디널리티 연산자 설명
없슴 카디널리티 연산자가 없으면 자식 요소의 인스턴스가 단 한번, 필히! 나타남.
? 0번 또는 1번. 없거나 하나만 있거나.
* 0번 또는 여러번.
+ 1번 또는 여러번.

속성(ATTRIBUTE) 선언


  • elementName은 속성들을 포함하고 있는 요소의 이름이다.
  • attrName은 속성의 이름이다.
  • attrType은 속성의 형이다.
  • attrDefaultN 은 속성이 반드시 필요한지 아닌지 여부.

속성의 디폴트 값

속성 디폴트 설명
#REQUIRED 속성은 요소의 모든 인스턴스에 반드시 나타나야 한다.
#IMPLIED 속성은 선택적이다. 있어도 좋고 없어도 좋고..
#FIXED(디폴트값과 함께 사용) 속성은 선택적이다. 만약 속성이 사용되면 반드시 디폴트값과 일치해야한다. 속성이 없어도 파서가 디폴트 값을 제공해 줄 수 있다.
디폴트값(키워드 없이 사용) 속성은 선택적이다. 속성이 사용되면 그 값을 따르고, 속성이 사용되지 않으면 파서가 디폴트 값을 제공해 줄 수 있다.

REQUIRED




IMPLIED


  • its_attr 속성은 선택적이다.
  • #IMPLIED에서는 디폴트 값 지정을 불허한다.

FIXED

  • 속성의 값을 특정값으로 고정시킨다.
    
    
    
  • Doc 요소에 version 속성이 있건 없건간에 무조건 "1.00"의 version 속성이 있다고 간주한다.
  • 만약 version 속성에 "1.00"이외의 값이 들어가면 유효하지 않은 XML 문서이다.
    haha
    혹은..
    haha
    

  • version 속성의 값을 하나의 값으로 제한하면서 모든 요소의 모든 인스턴스에서 사용되지 않아도 되게 하려면 #IMPLIED 키워드를 가진 열거 속성형을 사용하면 된다.
    
    
    

속성 형(Type)

10가지 형이 있다.

CDATA(문자 데이터)

  • 일반 텍스트
    
    
  • AnElement의 속성 its_attr은 문자열 데이터를 가지며 필수적으로 있어야한다.
    ...
    
  • CDATA 속성값에는 외부엔티티 참조를 사용할 수 없다.
  • 내부에 정의된 엔티티 참조는 사용할 수 있다.(<, >, &, &apos;, ")
  • 문자 참조는 사용할 수 있다.(A; 등..)
  • "<" 문자는 올 수 없다. <로 대체하라.

열거형

  • 지정된 텍스트 문자열 중의 하나만을 속성 값으로 사용한다.
    
    
    
  • 실 사용예
    
      John
      Q
      Public
    
    

ID 속성 형(요소 식별자)




  • ID 형을 사용하는 속성은 요소의 인스턴스에서 유일하게 식별할 수 있는 이름을 제공한다.
    ID 속성값은 XML 이름 규칙에 따라야 하고, 그 값은 사용하는 문서에서 유일해야 한다.
  • 값은 숫자로 시작할 수 없다. 문자 + 숫자 형은 가능하다.
  • 각 요소 형에서 ID는 단 한 개만 사용할 수 있다.
  • 이 형의 모든 속성은 #IMPLIED 혹은 #REQUIRED로 선언해야 한다.

IDREF / IDREFS 속성 형 (요소 사이의 관계)




혹은, 한 책에 대한 저자가 여러명 일 수 있으므로



  • IDREF 속성 값은 적합한 XML 이름이어야 하고, 같은 문서 내의 ID 속성 값과 일치해야 한다.
  • 동일한 ID에 대해 여러 IDREF 링크들이 허용된다.
  • IDREFS는 한 속성에 여러 ID 값들을 공백으로 구분하여 가질 수 있다.

NMTOKEN, NMTOKENS 속성 형


  • NMTOKEN은 CDATA와 동일하지만, 공백 문자가 올 수 없다.
  • NMTOKENS는 NMTOKEN이 한 속성에서 공백으로 구분되어 여러개 있는 것이다.
  • 열거형과 CDATA형의 중간 형태.
    ...
    
    
    

ENTITY/ENTITIES 속성 형

  • ENTITY의 이름을 속성의 값으로 지정한다. 엔티티의 이름을 지정할 때 "&"와 ";"는 뺀다.
  • ENTITIES는 공백으로 구분하여 여러개의 엔티티를 지정할 수 있다.

NOTATION 형


  • NOTATION 속성 값은 반드시 적절한 XML이름이어야 하고, 동일한 DTD내의 선언과 일치해야 한다.
  • 각 요소 형에 대해 NOTAION 속성 하나가 존재할 수 있다.
  • 이 속성 형은 EMPTY 요소와 함께 사용 될 수 없다.

Notation : 비 XML 데이터

  • 텍스트가 아닌 바이너리 데이터 등을 다루기 위한 선언
  • Notation은 XML 어플리케이션에서 파싱되지 않은 엔티티나 다른 비-XML 데이타를 다루기 위해 사용된다.
  • 기본 선언 형태

    
    
    
    

일반 엔티티(ENTITY)

  • 엔티티는 엔티티가 나오면 그 부분을 지정되 다른 문자열로 대체한다.
  • 엔티티의 대체 문자열은 Well-Formed XML이어야 한다.
    
    
  • 엔티티는 직접적으로 또는 간접적으로 자신의 이름을 참조할 수 없다. (즉, 재귀적인 참조가 허용되지 않는다.)
  • 엔티티에 속성 값의 끝 구분문자(" 혹은 ')를 포함할 수 없다.
  • 엔티티를 참조하려면 &엔티티이름;와 같이 해야한다.
    
    
    	
    	
    
    	
    	
    	
    	
    ]>
    
    
    	&Disclaimer;
    
    

매개 변수 엔티티


  • 매개 변수 엔티티는 DTD에서만 사용된다.
    
    
    
    
    
    
    
    
    

독립 문서 선언


  • standalone 속성을 통해 XML 프로세서가 DOCTYPE 선언을 해석하는 방법 제공.
  • yes : 문서는 자체에 포함되어 있으며 다른 데이터를 요구하지 않는다.
  • no : 문서는 외부 DTD에 포함된 마크업을 사용한다.

DTD의 제약

  1. 비 XML 구문이다.
  2. DTD는 확장할 수 없다.
  3. 오직 하나의 DTD만이 문서와 결합할 수 있다.
  4. DTD는 XML 네임스페이스를 잘 지원하지 않는다.
  5. 매우 약한 데이터 형을 사용한다.
  6. 객체 지향 형의 개체 상속을 하지 못한다.
  7. 내부 서브셋을 사용하여 외부 서브셋을 무시할 수 있다.
  8. DOM을 지원하지 않는다.
  9. 상대적으로 오래되었다.