본문 바로가기

XML

XML - 2# 유효한 문서 DTD 만들기


#PCDATA

DTD에서는 마크업을 사용하지 않는 텍스트를 "파싱된 문자 데이터"라고 하며, 구성요소의 선언에서는 줄여서 *PCDATA라고 합니다.
DTD를 사용하여 문서의 내용을 지정하는 유일한 방법인데, 실제 내용의 형식에 대해서는 더 이상 알 수 없습니다. 예를 들어 숫자를 저장하고자 하더라도 DTD에서는 데이터를 일반적인 텍스트로 인식하게 되는 것이지요.
이러한 정확도의 부재 때문에, DTD에 대한 대안으로 XML 스키마가 개발 되었습니다.
스키마에서는 저장하고자 하는 데이터의 형식에 대하여 정수, 실수 또는 날짜 형식 등과 같이 좀더 자세한 내용을 지정할 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE DOCUMENT [
<!ELEMENT DOCUMENT (CUSTOMER)*>
<!ELEMENT CUSTOMER (#PCDATA)>
]>
<DOCUMENT>
<CUSTOMER>
Sam Smith
</CUSTOMER>
</DOCUMENT>

여러 자식 요소 다루기

여러 자식 요소들을 포함하는 구성요소를 선언할 때의 옵션
a+ : a가 하나 이상 나오는 경우
a* : a가 0 또는 그 이상 나오는 경우
a? : a 또는 아무 것도 없는 경우
a,b : a 다음에 b가 나오는 경우
a l b : a 또는 b가 나오지만, 동시에 나오지는 않는 경우
(표현식) : 괄호에 포함된 표현식은 하나의 단위로 처리하여 위와 같은 ?, *, + 연산자를 붙이고자 하는 경우

이제 위 옵션에 대해 자세히 알아보도록 하겠습니다.

1. 하나 이상의 자식요소

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE DOCUMENT [
<!ELEMENT DOCUMENT (CUSTOMER)+>
<!ELEMENT CUSTOMER (#PCDATA)>
]>
<DOCUMENT>
<CUSTOMER>
Sam Smith
</CUSTOMER>
<CUSTOMER>
Fred smith
</CUSTOMER>
</DOCUMENT>

<DOCUMENT>요소에 12와 15개의 <CUSTOMER>요소만을 포함하고자 할 때 사용할 수 있는데,
(CUSTOMER) 옆에 +를 붙여 주면 XML 처리기에서는 <DOCUMENT>요소가 최소한 하나 이상의 <CUSTOMER> 요소를 포함하고자 한다는 것을 알 수 있게 됩니다.

2. 0 또는 그 이상의 자식 요소

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE DOCUMENT [
<!ELEMENT DOCUMENT (CUSTOMER)*>
<!ELEMENT CUSTOMER (#PCDATA)>
]>
<DOCUMETN>
<CUSTOMER>
Sam Smith
</CUSTOMER>
<CUSTOMER>
Fred smith
</CUSTOMER>
</DOCUMETN>


구성요소가 특정 자식 요소 또는 여러 개의 이런 요소들을 포함하거나, 특정 자식요소를 강제로 갖지 않도록 하고자 할 때 유용하게 사용할 수 있습니다.
예를 들어, <CHAPTER>요소가 <FOOTNOTE> 요소를 포함하거나 여러 개의 <FOOTNOTE> 요소를 가질 수 있도록 하거나 반드시 모든 <CHAPTER>구성요소가 <FOOTNOTE>요소를 강제로 갖지는 않도록 하는 경우에 사용합니다.
위의 경우는 여러 개수를 가지는 것을 나타낸 것입니다.

3. 0 또는 하나의 자식 요소

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE DOCUMENT [
<!ELEMENT DOCUMENT (CUSTOMER)?>
<!ELEMENT CUSTOMER (#PCDATA)>
]>
<DOCUMETN>
<CUSTOMER>
Sam Smith
</CUSTOMER>
</DOCUMETN>


?는 선언하고 있는 요소에 특정 자식 요소가 존재할 수도 있고 필요하지 않을 수도 있음을 의미합니다.
예를 들어, <CHAPTER> 요소는 하나의 <OPENING_QUOTATION> 요소를 포함할 수 있으나, 모든 <CHAPTER>요소가 <OPENING_QUOTATION>요소를 강제로 포함하도록 할 필요가 없을 경우 ?를 사용한다는 것입니다.

4. DTD 순차

특정 구성요소가 어떤 자식 요소들을 포함할 수 있는지와 그 순차를 정확히 지정할 수도 있습니다.

<!ELEMENT CUSTOMER (NAME, DATE, ORDER)>

각각 한개 씩 순서대로 <NAME>, <DATE>, <ORDER>요소를 포함하는 것입니다.


<!ELEMENT NAME (LAST_NAME, FIRST_NAME)>

<NAME>요소가 정확히 <LAST_NEME>과 <FIRST_NAME>요소만을 포함하도록 지정한 것입니다.


<!ELEMENT NAME (LAST_NAME, FIRST_NAME)>

공백은 문제가 되지 않습니다.


<!ELEMENT CUSTOMER (NAME, NAME, NAME)>

<CUSTOMER>요소가 정확히 3개의 <NAME>요소를 포함해야 하도록 합니다.


<!ELEMENT CUSTOMER (NAME+, CREDIT_RATING?, DATE*, ORDERS)>

순차 내부에서도 연산자들을 사용할 수 있습니다.

'XML' 카테고리의 다른 글

XML - JavaScript 이해하기  (0) 2012.01.17
XML - 3# 유효한 문서 DTD 만들기  (0) 2012.01.17
XML - 4# 유효한 문서 DTD 만들기  (0) 2012.01.17
XML - 1# 유효한 문서 DTD 만들기  (1) 2012.01.17
XML - XML의 기본  (0) 2012.01.17