- 엘리먼트(Element)란?
다른 이름으로 원소 선언이라고도 한다.
XML 문서의 가장 기초를 구성하는 틀.
[정보와 구조적 정의를 포함한다.]
엘리먼트들을 사용하여 문서의 논리적인 구조를 정의하는 것으로 가장 중요하다.
책을 예로 들자면 한 권의 책은 장들로 구성되고 장들은 절로, 절 안에는 마찬가지로 논리적인 구조를 가지게 되는데
엘리먼트는 XML 문서 안에서의 논리적인 계층을 형성하게 만들어 주는 도구이다.
<책> |
각 엘리먼트들은 부모 엘리먼트의 밑에 각각 부모 - 자식의 관계를 형성하고 있다.
<책> 이라는 루트 엘리먼트는 그 아래 <장> 이라는 엘리먼트가 있고
여기서 <책> 엘리먼트를 부모 엘리먼트, <장> 엘리먼트를 자식 엘리먼트가 되는 것이다.
XML에는 문서 객체가 있어서, 그것으로부터 마크업 트리 구조가 시작할 수 있는 뿌리를 제공하기도 한다.
만일 Book이 문서의 루트 엘리먼트라면 이것이 문서 객체의 자식이 된다.
- 엘리먼트 선언 방법
<!ELEMENT 엘리먼트 이름 내용모델>
<!ELEMENT 다음에 엘리먼트의 이름을 쓰고 다음에는 내용 모델이 나온다.
항상 <!ELEment 로 시작하며 대소문자를 구별한다.
(옳은 예시)
<ADDRESS> 110 main street </ADDRESS>
<address> 110 main street </address>
(틀린 예시)
<ADDRESS> 110 main street </address>
태그 |
의미 |
<fist_tag> |
시작 태그로 적합함. |
</first_tag> |
끝 태그로 적합함. |
<fist tag> |
엘리먼트 이름은 공백이 있어서는 안됨. |
<1st_tag> |
엘리먼트 이름의 시작은 숫자여서는 안됨. |
</ fist_tag> |
끝 태그를 의미하는 / 다음에 공백은 허용하지 않음. |
- 내용 모델이란?
한 엘리먼트의 자식으로써 나타날 수 있는 엘리먼트 및 텍스트 데이터에 대한 묘사
즉, 한 엘리먼트의 밑에 어떤 엘리먼트나 텍스트가 올 수 있는지 기술하는 것.
- 내용 모델의 종류
>> 엘리먼트들의 목록
>> #PCDATA
>> ANY 키워드
>> EMPTY 키워드
>> 혼합내용(mixed-content)
- 엘리먼트들의 목록이란?
엘리먼트의 자식으로서 다른 엘리먼트들을 선언하는 것.
괄호 안에 자식 엘리먼트들의 목록을 쓰면 된다.
- 자식 노드만을 가질 때 - children
children은 별도의 키워드를 사용하는 것이 아니라,
엘리먼트들이 나타날 위치와 나타날 횟수를 그 규칙에 명시한 것으로
목록에 있는 모든 엘리먼트는 자체적인 선언을 가져야 한다.
기호 |
설명 |
예제 |
기호없음 |
반드시 한번 나타남 |
tag |
, |
순서대로 나타남 |
tag1, tag2 |
? |
한번 나타날 수도 있고 안 나타날 수도 있음 |
tag? |
| |
선택(하나만 사용할 수 있다) |
tag1 | tag2 |
* |
0번 이상 나타남 |
tag* |
+ |
1번 이상 나타남 |
tag+ |
() |
그룹 |
(tag1 | tag2), tag3 |
선언 예시)
1. <!ELEMENT Homepage (......)>
Homepage 라는 이름의 루트 엘리먼트를 선언.
괄호 안에는 내용 모델을 집어넣어 루트 엘리먼트의 자식으로서 어떤 엘리먼트들이 있는지 선언한다.
2. <!EMEMENT Homepage (Title, Greeting?, News, Menu)>
제목을 위한 엘리먼트 Title
방문객을 위한 인사말 엘리먼트 Greeting [인사말은 꼭 필요한 것이 아니라 생각하여 선택적인 것(기호 ?로 선언)]
홈페이지의 새로운 소식을 알리는 News 엘리먼트
홈페이지 메뉴 목록을 위한 Menu 엘리먼트
라고 정의했을 때 3번부터 5번처럼 선언하게 된다.
3. <!EMEMENT News (Date, Title, Text)>
날짜, 제목, 글을 나타내는 Date, Title, Text 엘리먼트가 차례대로 나타난다고 선언함.
4. <!EMEMENT Menu (Item*)>
각각의 메뉴 항목을 나타내는 Item 엘리먼트가 있는데, 메뉴 항목이 하나도 없는 경우 무한대까지 고려한다면 4번과 같이 선언한다.
5. <!EMEMENT Menu (Item+)>
만약 메뉴 항목이 적어도 하나라도 있어야 하는 것으로 선언하고 싶다면 5번과 같이 선언한다.
- 엘리먼트의 종류 및 선언 방식
1. #PCDATA
엘리먼트의 시작 태그와 종료 태그 사이에 파싱되는 문자 데이터가 들어가는 것을 말함.
이 선언은 최하위 엘리먼트에 사용됨.
예)
<!ELEMENT taxt (#PCDATA)>
taxt라는 이름의 엘리먼트 시작 태그와 종료 태그 사이에 문자 데이터가 들어가게 하고 싶을 때 예와 같이 선언한다.
2. ANY 키워드
시작 태그와 끝 태그 사이에 문자 데이터와 임의의 원소들이 올 수 있다는 것을 의미함.
즉, 엘리먼트의 내용으로써 모든 종류의 데이터와 마크업을 포함할 수 있음을 선언하며
어떠한 엘리먼트나 텍스트 순서나 횟수에도 상관없이 나타날 수 있다는 것을 의미함.
예)
<ELEMENT anyTag ANY>
ANY는 정확한 문서를 정의하기 위해서는 바람직하지 않지만,
새로운 DTD 개발을 하는 경우에는 자주 사용될 수 있다.
3. EMPTY 키워드
엘리먼트가 내용을 갖지 않는 공백 태그를 선언할 때 사용되는 키워드.
EMPTY로 정의된 엘리먼트는 속성을 가질 수는 있지만, 시작 태그와 종료 태그 사이에 아무런 내용도 있을 수 없다.
예)
<!ELEMENT HT EMPTY>
HT라는 공백 태그를 위한 원소를 선언한 예
4. 혼합내용(mixed-content)
반드시 나와야 한다거나 순서대로 나와야한다는 조건 없이, 여러 개의 엘리먼트가 자식 엘리먼틀 나타나는 것을 허용함.
예)
<!EMEMENT mixed ( #PCDATA | otherTag )*>
항상 #PCDATA가 먼저 나와야 한다는 것에 주의해야함.
- 공백 태그(empty tag)란?
시작 태그와 끝 태그 사이에 어떠한 내용도 포함하지 않는 경우에 이러한 태그를 공백 태그라고 함.
참고 문헌 및 링크
ADD-ON XML
클릭하세요 XML
자바 개발자를 위한 XML