[웹 서비스 개발] XML_DTD_2024 (2)

김광일·2024년 9월 21일

웹 서비스 개발

목록 보기
10/45
post-thumbnail

[3] Elements 선언

1) 형식

: <!ELEMENT 구문을 사용하여 정의한다.

<!ELEMENT element-name category>
<!ELEMENT element-name (element-content)>
  • element-name: 요소의 이름
  • category: 요소의 콘텐츠 유형 (EMPTY, ANY, (#PCDATA), 자식 요소)

2) 빈 요소의 경우 EMPTY 선언

: 빈 요소는 콘텐츠 없이 선언되며, EMTPY 키워드를 사용

<!-- 형식 -->
<!ELEMENT element-name EMPTY>
<!-- 예시 -->
<!ELEMENT br EMPTY>

[4] 구문 분석 가능한 문자 데이터가 있는 Elements

1) 형식

: #PCDATA를 사용하여 선언된다. (순수 텍스트만 포함)

<!-- 형식 -->
<!ELEMENT element-name (#PCDATA)>
<!-- 예시 -->
<!ELEMENT from (#PCDATA)>

[5] 모든 콘텐츠가 있는 요소 (ANY)

: 카테고리 키워드 ANY로 선언한 element는 구문 분석 가능한 데이터의 모든 조합을 포함할 수 있다. (텍스트, 자식 요소, 그 어떤 콘텐츠도 가질 수 있음)

1) 형식

<!-- 형식 -->
<!ELEMENT element-name ANY>
<!-- 예시 -->
<!ELEMENT note ANY>

[6] 요소의 발생을 N번 선언

1) 한 번만

: note 요소는 message 요소를 한 번만 포함할 수 있다.

<!-- 형식 -->
<!ELEMENT element-name (child-name)>
<!-- 예시 -->
<!ELEMENT note (message)>

2) 최소 1회 이상 (+)

: note 요소는 최소 한 개 이상의 message 요소를 포함해야 한다.

<!-- 형식 -->
<!ELEMENT element-name (child-name+)>
<!-- 예시 -->
<!ELEMENT note (message+)>

3) 최소 0회 이상 (*)

: note 요소는 message 요소를 포함하지 않을 수도 있고, 여러 개를 포함할 수도 있습니다.

<!-- 형식 -->
<!ELEMENT element-name (child-name*)>
<!-- 예시 -->
<!ELEMENT note (message*)>

4) 0또는 1회 (?)

: note 요소는 message 요소를 포함하지 않거나, 최대 한 번 포함할 수 있습니다.

<!-- 형식 -->
<!ELEMENT element-name (child-name?)>
<!-- 예시 -->
<!ELEMENT note (message?)>

[7] 둘 중 또는 하나 콘텐츠 선언 (|)

1) 형식

: | 연산자를 사용하여 두 개 이상의 요소 중 하나를 선택하도록 선언할 수 있습니다.

<!ELEMENT note (to, from, header, (message|body))>

[8] 혼합 콘텐츠 선언하기

: 구문 분석된 문자 데이터와 자식 요소를 함께 포함할 수 있습니다.

<!ELEMENT note (#PCDATA|to|from|header|message)*>

: note 요소에 구문 분석된 문자 데이터, to, from, header, message 요소가 최소 0개 이상 포함될 수 있다.

[9] DTD 속성 중요 가이드

  • 속성을 데이터의 컨테이너로 사용하지 말 것: 속성은 문서의 데이터를 표현하기보다 보조 정보나 메타데이터에 사용해야 합니다. 예를 들어, 이름과 같은 주요 데이터를 속성으로 정의하지 않고, 요소로 정의하는 것이 좋습니다.
  • 데이터를 설명할 때는 요소를 사용: XML의 목적은 데이터를 계층적으로 표현하는 것이므로, 중요한 데이터는 요소로 표현해야 합니다.
  • 데이터와 관련 없는 정보에 속성 사용: 데이터와 직접 관련이 없는 부가적인 정보(예: 식별자, 스타일 정보 등)는 속성을 통해 전달할 수 있습니다.

[10] 종합 예시

: 위 예시에서는 library 요소가 최소 한 개 이상의 book 요소를 포함하고, book 요소는 title, author, 그리고 genre 또는 summary 중 하나를 선택적으로 포함할 수 있다.

<!DOCTYPE library [
  <!ELEMENT library (book+)>
  <!ELEMENT book (title, author, (genre | summary)?)>
  <!ELEMENT title (#PCDATA)>
  <!ELEMENT author (#PCDATA)>
  <!ELEMENT genre (#PCDATA)>
  <!ELEMENT summary (#PCDATA)>
]>
<library>
  <book>
    <title>XML Guide</title>
    <author>John Doe</author>
    <genre>Technology</genre>
  </book>
  <book>
    <title>Learn DTD</title>
    <author>Jane Smith</author>
    <summary>A comprehensive guide to DTD.</summary>
  </book>
</library>

[11] 적절하지 않은 방식으로 사용된 예시

1) 문제점

  • 중요 데이터가 속성으로 표현됨: 날짜, 보낸 사람, 받는 사람, 메모의 내용 등 중요한 데이터가 모두 속성으로 표현되고 있다.
    • 이러한 정보는 XML 요소로 선언되는 것이 더 적절하다.
    • 속성은 보조적이고 메타 데이터로만 사용되는 것이 좋다.
  • 데이터 구조의 명확성 부족: 이 방식은 데이터의 의미를 명확하게 드러내지 않는다.
    • 예를 들어, day, month, year는 날짜를 나타내지만 구조적으로 이를 하나의 요소로 묶지 않고, 각각 속성으로 나누어져 있어서 의미가 명확하지 않다.
  • 확장성 문제: 만약 이 구조를 확장하여 더 많은 정보를 추가해야 한다면 속성의 복잡성이 증가할 수 있으며, XML 문서의 가독성과 유지 보수가 어려워질 수 있다.

2) 올바른 사용 예시

<note>
  <date>
    <day>12</day>
    <month>11</month>
    <year>2002</year>
  </date>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>
  • <date> 요소: 날짜 데이터를 하나의 요소로 묶어 명확하게 표현했습니다. 그 안에 <day>, <month>, <year>라는 하위 요소를 사용하여 데이터를 구조화했습니다.
  • <to>, <from> 요소: to와 from도 속성이 아닌 요소로 정의하여, 받는 사람과 보낸 사람을 명확하게 구분했습니다.
  • <heading>, <body> 요소: 메모의 제목과 내용을 각각 요소로 정의하여, 문서의 내용이 더 읽기 쉽고 명확하게 표현되었습니다.

profile
안녕하세요, 사용자들의 문제 해결을 중심으로 하는 프론트엔드 개발자입니다. 티스토리로 전환했어요 : https://pangil-log.tistory.com

0개의 댓글