ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • XML DTD 정의
    컴공지식/웹 2024. 9. 26. 21:45

    XML DTD는 대충 이렇게 생겼다.

    <!ELEMENT letter (contact+, salutation, paragraph, closing, signature)>

    <!ELEMENT salutation ( #PCDATA )>

     

    여기서 ELEMENT는 XML에서 사용하는 요소를 정의할 때 쓴다.

    letter과 salutation이 있는데 이들이 요소의 이름이 된다.

     

    contact 뒤에 +가 있는데, 이는 이 요소를 적어도 1개 이상은 써야한다는 의미다. 프로그래밍 언어론에서 다뤘던 기호 같다..

    letter가 다양한 요소들을 감싸고 있는데 이는 감싸고 있는 요소들을 포함할 수 있다는 의미다.

    salutation이 감싸고 있는 #PCDATA는 그냥 텍스트를 뜻한다.

    salutation 안에는 텍스트를 작성할 수 있다는 뜻이다.

    <salutation>안녕</salutation>

    처럼 말이다.

     

    그리고 다음과 같은 DTD의 정의가 있는데

    <!ATTLIST contact type CDATA #REQUIRED>

    contact라는 요소의 속성을 정의하는 부분이다.

    이를 보면 type이라는 말로 type을 정의함을 볼 수 있다.

    이를 tape라고 바꿔도 된다.

    대신 그렇게 바꾸면 나중에 요소를 쓸 때 tape=~~ 라고 적어야겠지만..

    아무튼 속성의 이름은 임의로 정할 수 있지만, 그 이름에 맞춰 나중에 사용할 때 주의해야 한다.

    CDATA는 캐릭터데이터를 의미한다. 그러니까 즉 문자를 의미한다.

    #REQUIRED는 이를 필수로 요구한다는 것이다.

    나중에 요소를 사용할 때 생략할 수 없다.

     

    또 다른 예제를 살펴보자

    <!ELEMENT flag EMPTY>
    <!ATTLIST flag gender (M | F)>

    이는 flag 요소를 정의하고 있는데 EMPTY라는 것은 내용을 담지 않는다는 것을 의미한다.

    <flag gender="M" /> 이렇게 사용할 수 있다는거다. 보면 내용이 없다.

    이 flag는 gender라는 속성을 사용하고 있는데, M과 F 둘 중 하나를 골라 쓸 수 있다.

    그리고 #REQUIRED가 없기 때문에 속성을 정의하지 않아도 사용할 수 있다.

     

    그 다음 엔티티 정의에 대해서 알아보자

    <!ENTITY myEntityA "Entity Value A">

    이 코드는 myEntityA를 변수처럼 사용할 수 있게 해준다.

    <message>
      Welcome to XML! &myEntityA;
    </message>

    이렇게 이용하면 Welcome to XML! Entity Value A라고 출력된다.

     

    이제 ID와 IDREF에 대해 알아보자

    ID 속성은 문서 내에서 고유한 식별자를 제공한다.

    즉, 문서 내에서 같은 ID 값을 가질 수 없으며, 하나의 요소만 그 ID를 가진다.

    IDREF 속성은 이미 선언된 ID 속성을 참조할 수 있다.

    IDREFS는 여러 ID 값을 참조할 수 있다.

    다음은 예시이다.

    <!ELEMENT bookstore (shipping+, book+)>
    <!ATTLIST shipping shipID ID #REQUIRED>
    <!ATTLIST book shippedBy IDREF #IMPLIED>

    위에서 shipID는 고유한 값을 가지며, shippedBy는 해당 ID를 참조한다.

    여기서 #IMPLIED는 선택적이라는 것을 의미한다.

    그러니깐.. shippedBy를 넣지 않아도 오류가 발생하지 않는다.

    <shipping shipID = "s1">
      <duration>2 to 4 days</duration>
    </shipping>
    <book shippedBy = "s1">
      Java How to Program 3rd edition.
    </book>

    이 경우, book 요소의 shippedBy 속성은 shipping 요소의 shipID인 s1을 참조하고 있다.

     

     

    NMTOKEN과 CDATA 차이를 알아보자

    CDATA는 문자 데이터를 나타내며, 거의 모든 문자를 허용한다.

    예를 들어, CDATA는 공백, 숫자, 심지어 특수 문자도 포함할 수 있다.

    NMTOKEN은 이름 토큰(Name Token)을 나타내며, 공백이나 특수 문자를 포함할 수 없고, 유효한 XML 이름에 사용할 수 있는 문자만 포함된다.

    NMTOKEN은 다음과 같이 정의된다.

    <!ATTLIST message id NMTOKEN #REQUIRED>

    이 경우, id 속성에는 유효한 이름 토큰만 들어가야 하므로, 공백이 들어가면 안된다.

    근데 NMTOKENS로 사용하게 되면 공백을 넣고 또 다른 id를 넣는게 가능하다.

    <message id = "s45">

    공백이나 특수 문자가 포함된 id는 유효하지 않기 때문에 오류가 발생할 수 있다.

     

    '컴공지식 > ' 카테고리의 다른 글

    XML DOM  (0) 2024.10.08
    XML 네임스페이스  (0) 2024.09.27
    DTD의 구성 요소  (1) 2024.09.20
    Entity References란?  (0) 2024.09.03
    XML의 Connector  (0) 2024.09.03
Designed by Tistory.