[웹 서비스 개발] DTD 정리 (for Quiz2)

김광일·2024년 9월 27일

웹 서비스 개발

목록 보기
15/45
post-thumbnail

1. DTD 선언 방법

[1] Internal

1) 예시

(1) ex. Internal.xml
<?xml version="1.0"?>
<!DOCTYPE note [
    <!ELEMENT note (to, from, heading, body)>
    <!ELEMENT to (#PCDATA)>
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body (#PCDATA)>
]>
<note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend</body>
</note>

[2] External

1) 예시

(1) ex. External.xml
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend</body>
</note>
2) note.dtd
<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

2. XML 문서의 구성 요소

[1] Attributes (속성)

1) 특징

  • 항상 속성 이름 = '속성값의 쌍으로 제공되어야 한다.
  • 여러 개의 속성을 지정해줄 수 있다.

[2] Entities (엔티티, 참조)

1) 종류

2) 예시

(1) EntityExample.xml
<?xml version="1.0" encoding="euc-kr" standalone="yes"?>
<?xml-stylesheet href="entityExample.css" type="text/css"?>
<MEMO>
    <TO> to : &quot; Eugene &quot;</TO>
    <FROM>From : Hong, Gil-Dong</FROM>
    <CONTENTS>Can we dine out at 1 PM?</CONTENTS>
</MEMO>
(2) entityExample.css
*{
    display: block;
}TO, FROM{
    font-weight: bold;
}

CONTENTS {
    color : red;
    font-style: italic;
    margin-top: 15px;
    margin-left: 10px;
}
(3) 결과 화면

[3] PCDATA

1) 특징

  • 구문 분석 가능한 문자 데이터
  • 파서에 의해 파싱될 데이터
  • 파서에서 엔티티와 마크업을 검사한다.
  • &, <, > 문자가 포함되지 않아야 한다.
    • 엔티티로 표현해야 한다.

2) 예시

(1) PCDATA.xml
<?xml version="1.0" encoding="UTF-8"?>
<user>
    <name>John Doe</name>
    <email>john.doe@example.com</email>
    <bio>I am a &lt;strong&gt;software developer&lt;/strong&gt; with 5+ years of experience.</bio>
    <skills>
        <skill>Java</skill>
        <skill>Python</skill>
        <skill>XML &amp; JSON</skill>
    </skills>
</user>
(2) 결과

[4] CDATA

1) 특징

  • 문자 데이터
  • 파서가 파싱하지 않는 텍스트
  • 텍스트 내부의 태그는

2) 예시

(1) CDATA.xml
<?xml version="1.0" encoding="UTF-8"?>
<script>
    <javascript><![CDATA[
    function greet(name) {
        if (name != null && name.length > 0) {
            alert("Hello, " + name + "!");
        } else {
            alert("Hello, stranger!");
        }
    }

    // Call the function
    greet("John");
    ]]></javascript>
</script>
(2) 결과

[5] PCDATA vs CDATA

1) 사용 시기

  • PCDATA: 일반적인 텍스트 내용을 XML에 포함할 때 사용.
  • CDATA: HTML, JavaScript, SQL 쿼리 등 특수 문자가 많은 내용을 XML에 포함할 때 사용.

2) 차이점 예시

1) PCDATA_CDATA.xml
<?xml version="1.0" encoding="UTF-8"?>
<example>
    <pcdata_section>
        <description>This is a PCDATA section. Special characters need to be escaped:</description>
        <code>if (x &lt; 10 &amp;&amp; y &gt; 20) { alert("Hello!"); }</code>
    </pcdata_section>

    <cdata_section>
        <description>This is a CDATA section. Special characters do not need to be escaped:</description>
        <code><![CDATA[if (x < 10 && y > 20) { alert("Hello!"); }]]></code>
    </cdata_section>
</example>
2) 결과

[6] Element

1) 선언하는 방법

  • <!ELEMENT 엘리먼트이름 내용모델>
  • 자식이 쉼표로 구분된 순선로 선언되는 경우, 자식은 동일한 순서로 나타나야 한다.

2) 내용모델 : Element가 포함할 수 있는 내용

<!-- 1. 빈 엘리먼트 -->
<!ELEMENT br EMPTY>
EMPTY: 내용이 없는 빈 엘리먼트를 선언.

<!-- 2. 텍스트만 포함하는 엘리먼트 -->
<!ELEMENT title (#PCDATA)>
(#PCDATA): 텍스트만 포함하는 엘리먼트를 선언.


<!-- 3. 자식 엘리먼트를 포함하는 엘리먼트 -->
<!ELEMENT book (title, author, year)>
자식 엘리먼트 나열: 특정 순서의 자식 엘리먼트를 포함하는 엘리먼트를 선언.

<!-- 4. 혼합 콘텐츠 엘리먼트 -->
<!ELEMENT paragraph (#PCDATA | emphasis | strong)*>
혼합 콘텐츠: 텍스트와 다른 엘리먼트를 함께 포함할 수 있는 엘리먼트를 선언.

<!-- 5. ANY 내용을 가진 엘리먼트 -->
<!ELEMENT note ANY>
ANY: 어떤 내용이든 포함할 수 있는 엘리먼트를 선언.

<!-- 6. 선택적 및 반복 자식 엘리먼트 -->
<!ELEMENT person (name, age?, (address | phone)*)>
특수 문자 사용:
    ?: 선택적 (0 또는 1번 출현)
    *: 0번 이상 반복
    +: 1번 이상 반복
    |: OR 연산자 (둘 중 하나 선택)

[7] 잘못된 예

<note day = "12" month = "11" year = "2022" to = "Tove" from = "Jani" heading = "REminder" body = "Don't forget me this weekend!">

1) 간단 설명

: 이미지에서 보이는 메시지는 "XML은 이렇게 사용되어서는 안 된다"는 내용이다.. 구체적으로 <note> 태그에 여러 개의 속성이 들어 있는데, 내용(body)을 속성으로 정의한 것이 문제. XML에서 이런 방식은 잘못된 사용법이다.

2) 왜 이런 방식이 잘못됐는지

  • 데이터와 메타데이터의 구분: XML 속성(attribute)은 메타데이터, 즉 요소의 부가적인 정보를 제공하는 용도로 사용됩니다. 요소의 주된 내용은 보통 요소의 본문(content)으로 들어가야 합니다. 예를 들어, ` 안의 메시지 본문("Don't forget me this weekend!")은 속성이 아닌 요소 안의 텍스트로 들어가야 합니다.
  • 가독성 문제: XML 요소 안에 중요한 데이터가 속성으로 들어가면, 데이터를 관리하고 이해하기 어려워집니다. 데이터는 본문으로 들어가야 더 구조적으로 명확해집니다.

3) 올바른 XML 사용 예:

(1) 잘못된 예
<note day="12" month="11" year="2002" to="Tove" from="Jani" heading="Reminder" body="Don't forget me this weekend!" >
</note>
(2) 올바른 예
<note day="12" month="11" year="2002" to="Tove" from="Jani" heading="Reminder">
    <body>Don't forget me this weekend!</body>
</note>

2. Attribute Type (속성 타입)

[0] 속성값 정의

[1] CDATA

: 문자열 데이터를 허용하는 타입.

[2] ENTITY

: 정의된 엔티티를 참조하는 타입.

[3] ID

: 고유한 식별자를 할당하는 타입. 각 요소에서 유일해야 함.

[CDATA, ENTITY, ID 예시]

1) 예시

(1) meesage_id.xml
<?xml version="1.0"?>
<!-- <?xml-stylesheet type = "text/css" href = "memoEntity.css"?> -->
<!DOCTYPE myMessage [
    <!ELEMENT myMessage ( message )>
    <!ELEMENT message ( #PCDATA )>
    <!ENTITY myEntityA "Entity Value A">
    <!ATTLIST message id CDATA #REQUIRED>
]>
<myMessage>
    <message id="445 myEntityA"> Welcome to XML! &myEntityA; </message>
</myMessage>
(2) 결과

[4] IDREF

: 다른 ID 값을 참조하는 속성.

[5] IDREFS

: 하나 이상의 ID 값을 참조하는 속성.

[ID, IDREF, IDREFS 예시]

1) 예시

(1) message_id.xml
<?xml version="1.0"?>
<!DOCTYPE bookstore [
    <!ELEMENT bookstore (shipping+, book+)>
    <!ELEMENT shipping (duration)>
    <!ATTLIST shipping shipID ID #REQUIRED>
    <!ELEMENT duration (#PCDATA)> <!-- duration 요소 선언 추가 -->
    <!ELEMENT book (#PCDATA)>
    <!ATTLIST book shippedBy IDREF #IMPLIED>
    <!ATTLIST book shippedBys IDREFS #IMPLIED>
]>
<bookstore>
    <shipping shipID="s1">
        <duration>2 to 4 days</duration>
    </shipping>
    <shipping shipID="s2">
        <duration>1 day</duration>
    </shipping>
    <book shippedBy="s2"> Java How to Program 3rd edition. </book>
    <book shippedBys="s1 s2"> Java How to Program 3rd edition. </book>
</bookstore>
(2) 결과

(3) 특징
  • shipping 태그의 속성
    • -> shipID는 id로 선언, #REQUIRED (필수)로 선언
  • book 태그의 속성
    • -> shippedBy는 IDREF로 선언, #IMPLIED (필수는 X)로 선언 -> 하나만 참조 가능
    • -> shippedBys는 IDREFS로 선언, #IMPLIED (필수는 X)로 선언 -> 여러 참조 가능

[6] NMTOKEN

: 이름 토큰으로 허용되는 값 (공백 없이 하나의 문자열).

1) 특징

  • 공백이나 특수 문자를 포함할 수 없다.

[7] NMTOKENS

: 여러 개의 이름 토큰 (공백으로 구분된 문자열 목록).

1) 특징

  • 하나 이상의 NMTOKEN을 공백으로 구분한 리스트.

[ NMTOKEN, NMTOEKNS 예시 ]

1) 예시

(1) NMTOKENS.xml
<!DOCTYPE example [
  <!ELEMENT example (name, tags)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT tags (#PCDATA)>
  <!ATTLIST example
    id NMTOKEN #REQUIRED
    categories NMTOKENS #IMPLIED
  >
]>
<example id="item123" categories="tag1 tag2 tag3">
  <name>Sample Item</name>
  <tags>Tags related to the item</tags>
</example>
(2) 결과

(3) 특징
  • example 태그의 속성 정의
    • id : NMTOKEN, #REQUIRED -> 하나 토큰만!
    • categories : NMTOKES, #IMPLIED -> 여러 토큰!

[8] select

1) 예시

(1) select.xml
<?xml version="1.0"?>
<!DOCTYPE myMessage [
    <!ELEMENT myMessage ( message )>
    <!ELEMENT message ( #PCDATA )>
    <!ATTLIST message id NMTOKENS #REQUIRED>
    <!ATTLIST message select (yes | no) "no" >
]>
<myMessage>
    <message id="445  abc" select="yes"> Welcome to XML! </message>
</myMessage>
(2) 특징
  • id는 NMTOKENS -> 여러 개 지정 가능
  • selec
    • 둘 중에 하나 값은 선택해야 함
    • Default값 지정 가능 (속성 사용 안해야 함)
    • 지정된 값 이외의 값 사용 시 에러
profile
안녕하세요, 사용자들의 문제 해결을 중심으로 하는 프론트엔드 개발자입니다. 티스토리로 전환했어요 : https://pangil-log.tistory.com

0개의 댓글