 |
|
난이도 : 초급 Kay Whatley, Technology Author, Freelance
원문 게재일 : 2009 년 2 월 24 일 번역 게재일 : 2009 년 3 월 17 일 이 기사에서는 XML을 처음으로 접하는 분들을 위해 XML 문서의 기본 개념에 대해 설명하고
이름 지정 규칙, 올바른 태그 중첩 방법, 속성 지침, 선언 및 엔티티를 비롯해 잘 구성된 XML을 만들기
위해 따라야 하는 규칙을 살펴봅니다. DTD 및 스키마 사용과 관련된 유효성 검증에 대해서도 설명합니다.
XML은 Extensible Markup Language의 약자이며, 여기에서 핵심은
Markup이다. 컨텐츠를 만든 후 컨텐츠에 구분 태그를 적용하여 각각의 단어, 구 또는
청크를 식별 및 정렬이 가능한 정보로 만들 수 있다. 사용자가 만든 파일이나 문서 인스턴스는
요소(태그)와 컨텐츠로 구성되어 있으며, 요소는 출력물을 읽을 때나 전자적으로 처리할 때
문서를 올바르게 파악하는 데 도움이 된다. 자세한 설명 요소를 사용할수록 문서의 더 많은 파트를
식별할 수 있다. 마크업의 초기부터 현재까지 컨텐츠에 태그를 지정하면서 얻을 수 있었던 장점은
컴퓨터 시스템이 손상되더라도 태그를 통해 파일의 데이터를 파악할 수 있다는 것이다.
개인 회사 및 정부 양식에서 시작된 마크업 언어는 SGML(Standard Generalized Markup Language)과
HTML(Hypertext Markup Language)을 거쳐 지금의 XML로 발전하였다. SGML은 지나치게 복잡하고 요소 세트에 불과한 HTML은 정보를 식별할 수 있을 정도로 강력한 기능을 제공하지는 못했다. XML은 사용하기 쉬우면서도 확장하기 쉬운 마크업 언어로 설계되었다.
XML을 사용하면 사용자의 고유 요소를 만들 수 있기 때문에 자유롭게 정확한 정보를
표현할 수 있다. 문서를 머리글과 단락으로 다루지 않고 문서 내의 각 파트를 식별할 수
있다. 효율성을 위해 이 기사에서는 몇 개의 요소만으로 구성된 목록을 정의하고 정의된
목록만을 사용하겠다. (DTD(Document Type Definition) 또는 스키마에 사용자가 직접
요소를 정의할 수 있다. 나중에 간단히 설명하겠다.) XML을 처음 사용하는 것이므로
실제로 파일을 만들어 보면서 여러 가지 요소 이름을 자유롭게 사용하면서 익히기를 바란다.
XML 빌드
앞에서 말한 대로 XML 파일은 컨텐츠와 마크업으로 구성되어 있다. 따라서 컨텐츠
양쪽에 태그를 지정하는 방식으로 요소 안에 컨텐츠를 넣게 된다. 예를 들어 XML 요리책을
만들어야 한다고 가정하자. 이제 Ice Cream Sundae라는 조리법을 XML로 만들려고
한다. 조리법 이름을 마크업하기 위해 텍스트 앞쪽에 시작 태그를 배치하고 텍스트 뒤에
종료 태그를 배치하는 형태로 요소의 텍스트를 묶는다. 그런 다음 이 요소에 recipename이라는
이름을 지정할 수 있다. 요소의 시작 태그를 표시하기 위해 <recipename>처럼
꺽쇠 괄호(<>) 안에 요소의 이름을 넣는다. 그런 다음
Ice Cream Sundae라는 텍스트를 입력한다. 텍스트 뒤에 요소의
종료 태그를 입력한다. 이 태그는 </recipename>처럼
꺽쇠 괄호 안에 요소 이름이 있고, 요소 이름 앞에 종료 슬래시(/)가
들어가는 형태로 구성된다. 이러한 태그가 하나의 요소를 구성하며, 이 요소 안에
컨텐츠를 입력할 수 있으며, 다른 요소까지도 입력할 수 있다.
개별 문서나 문서 세트에 사용할 요소 이름을 만들 수 있다. 자신의 구체적인 요구
사항에 따라 요소에 적용할 규칙을 만들 수 있다. 요소에 매우 구체적인 이름을 지정할
수도 있고 일반적인 이름을 지정할 수도 있다. 각 요소에 포함할 수 있는 컨텐츠에 대한
규칙을 만든 후 이러한 규칙을 엄격하게, 느슨하게 또는 유연하게 적용할 수 있다. 문서에서
중요하다고 생각되는 파트를 식별하는 요소를 만들어야 한다.
XML 파일 시작하기
XML 문서의 첫 번째 행에는 XML 선언이 있다. 파일에서 이 선택적 부분은 해당
파일이 XML 파일임을 나타낸다. 따라서 도구와 사람은 이 부분을 보고 해당 파일을 SGML이나
다른 마크업이 아닌 XML 파일로 식별하게 된다. 선언은 <?xml?>과
같이 간단한 형태로 이루어질 수도 있지만 XML 버전(<?xml version="1.0"?>)이나
문자 인코딩(예: 유니코드의 경우 <?xml version="1.0" encoding="utf-8"?>)을
포함할 수도 있다. 이 선언은 파일의 맨 처음에 한 번 표기되어야 하므로 작은 XML 파일들을 큰 파일로
결합할 경우에는 이 선택적 정보를 삭제해야 한다.
루트 요소 만들기
루트 요소의 시작 및 종료 태그는 XML 문서의 컨텐츠를 둘러싼다. 파일에는 단
하나의 루트 요소만 있으며 이 "랩퍼"를 사용하여 모든 컨텐츠를 포함해야 한다. Listing 1에서는
<recipe>라는 루트 요소를 사용하는 예제의 일부를
보여 준다. (전체 XML 파일을 보려면 다운로드를 참조하라.)
Listing 1. 루트 요소
<?xml version="1.0" encoding="UTF-8"?>
<recipe>
</recipe>
|
<recipe>와 </recipe>
사이에 컨텐츠와 추가 태그를 넣어가면서 문서를 완성하게 된다.
요소 이름 지정하기
 |
태그 내 대소문자 일치
XML을 만들 때는 시작 태그와 종료 태그의 대소문자가 일치해야 한다는 점에 주의해야 한다. 대소문자가
일치하지 않으면 XML을 사용하거나 볼 때 오류가 발생할 수 있다. 예를 들어 Internet Explorer에서는
대소문자가 일치하지 않으면 파일 컨텐츠가 표시되지 않는다. 대신 시작 태그와 종료 태그가 일치하지
않는다는 메시지가 표시된다.
|
|
지금까지 <recipe>라는 루트 요소를 만들었다. XML에서는
요소의 이름을 지정한 후 이름을 기반으로 해당 DTD나 스키마를 정의한다. 이름에는 영문자, 숫자 및
밑줄(_)과 같은 특수 문자를 사용할 수 있다. 다음은 이름을 지정할 때
고려해야 하는 사항이다.
- 요소 이름에는 공백을 사용할 수 없다.
- 이름은 숫자나 기호가 아닌 영문자로 시작해야 한다. (이 첫 번째 문자 뒤에는 문자, 숫자 및 허용되는 기호를 원하는 대로 조합하여 사용할 수 있다.)
- 대소문자를 구분하지는 않지만 혼란스럽지 않도록 일관성을 유지하는 것이 좋다.
앞의 예제에 <recipename>이라는 요소를 추가할 경우
시작 태그 <recipename>과 이에 상응하는 종료 태그 </recipename>을
사용하게 된다.
Listing 2. 추가 요소
<?xml version="1.0" encoding="UTF-8"?>
<recipe>
<recipename>Ice Cream Sundae</recipename>
<preptime>5 minutes</preptime>
</recipe>
|
XML 문서에는 내부에 컨텐츠가 없고 시작 및 종료 태그 세트가 아닌 단일 태그로
표현할 수 있는 몇 가지 빈 태그를 사용할 수 있다. HTML 형태의 예제를 사용하기 위해
<img src="mylogo.gif">를 독립형 요소로 사용할 수 있다. 이 요소는 하위 요소나 텍스트를 포함하지 않기 때문에
빈 요소이며 공백과 익숙한 종료 슬래시로 끝나는 <img src="mylogo.gif" />와
같이 표현할 수 있다.
요소 중첩하기
중첩이란 한 요소 내에 다른 요소들을 배치하는 것이다. 이러한 새 요소를
하위 요소라고 하고, 하위 요소를 묶고 있는 요소를 상위 요소라고 한다. Listing
3에서는 <recipe> 루트 요소 내에 여러 요소가 중첩되어
있다. 이들 중첩된 하위 항목에는 <recipename>, <ingredlist>
및 <preptime>이 있다. <ingredlist>
요소 내에서는 하위 요소인 <listitem>이 여러 번 사용된다. XML
문서에서는 중첩 깊이 수준에 제한이 없다.
부적절한 상위 및 하위 요소의 중첩으로 인해 발생하는 구문 오류는 자주 발생하는
오류 중 하나이다. 모든 하위 요소는 해당 상위 요소의 시작 태그와 종료 태그 사이에
완전히 포함되어야 하고 형제 요소는 다음 형제 요소가 시작되기 전에 끝나야 한다.
Listing 3의 코드에서는 적절하게 사용된 중첩을 보여
준다. 태그들이 서로 섞이지 않은 채로 시작하고 끝난다.
Listing 3. 적절하게 중첩된 XML 요소
<?xml version="1.0" encoding="UTF-8"?>
<recipe>
<recipename>Ice Cream Sundae</recipename>
<ingredlist>
<listitem>
<quantity>3</quantity>
<itemdescription>chocolate syrup or chocolate fudge</itemdescription>
</listitem>
<listitem>
<quantity>1</quantity>
<itemdescription>nuts</itemdescription>
</listitem>
<listitem>
<quantity>1</quantity>
<itemdescription>cherry</itemdescription>
</listitem>
</ingredlist>
<preptime>5 minutes</preptime>
</recipe>
|
속성 추가하기
속성을 요소에 추가할 수도 있다. 속성은 이름/값 쌍으로 구성되어 있으며, 값은
큰따옴표로 묶여져 있다(예: type="dessert"). 속성을 사용하면
요소를 사용할 때마다 추가 정보를 저장할 수 있으며, 동일한 문서에서 필요에 따라 인스턴스별로
속성 값을 변경할 수 있다.
속성의 시작 태그 내에 하나 이상의 속성을 입력할 수 있다(예: <recipe
type="dessert">). 여러 속성을 추가할 경우에는 공백을 사용하여 각각의 속성을 구별한다(예:
<recipename cuisine="american" servings="1">). Listing 4에서는 현재까지 설명한 내용이 들어 있는 XML 파일을 보여 준다.
Listing 4. 요소와 속성이 들어 있는 현재 XML 파일
<?xml version="1.0" encoding="UTF-8"?>
<recipe type="dessert">
<recipename cuisine="american" servings="1">Ice Cream Sundae</recipename>
<preptime>5 minutes</preptime>
</recipe>
|
속성은 필요한 개수만큼 사용할 수 있으며 속성의 수는 문서에 추가할 세부사항을
고려해서 결정하는 것이 좋다. 속성은 조리법 유형별로 정렬하는
경우와 같이 문서를 정렬할 때 특히 유용하다. 속성 이름에 사용할 수 있는 문자는 요소
이름에 사용할 수 있는 문자와 동일하며, 요소 이름과 비슷하게 공백을 사용할 수 없고
영문자로 시작해야 한다는 규칙이 적용된다.
잘 구성된 XML과 유효한 XML
구조에 지정된 규칙을 따르면 잘 구성된 XML을 손쉽게 만들 수 있다. 잘 구성된 XML이란
적절한 요소 이름 지정, 중첩, 속성 이름 지정 등의 모든 XML 규칙을 따르는 XML이다.
XML을 사용하여 수행하는 작업에 따라 잘 구성된 XML 작업을 수행할 수 있다. 그러나 앞에서
언급한 조리법 유형별로 정렬하는 예제의 경우 조리법을 정렬하려면 모든 <recipe>
요소에 type 속성이 들어 있어야 한다. 올바르게 유효성을
검증하고 이 속성 값이 항상 존재하도록 보장할 수 있는 기능이 매우 중요하다.
유효성 검증은 요소에 대한 규칙과 각 상위 요소에 대한 하위 요소를 정의한
방법에 따라 문서의 구조를 검사하는 것이다. 이러한 규칙은 DTD(Document Type Definition)
또는 스키마에 정의한다. 이 유효성 검증을 수행하려면 DTD나 스키마를 만든 후 XML 파일에서
해당 DTD나 스키마를 참조해야 한다.
유효성 검증을 사용하려면 XML 문서의 전반부에 문서 유형(DOCTYPE)을
포함시켜야 한다. 이 행은 해당 문서의 유효성을 검증하는 데 사용할 DTD 또는 스키마(요소 및 규칙 목록)을
참조한다. 예를 들어 DOCTYPE이 Listing 5와 비슷한
내용을 읽어올 수 있다.
Listing 5. DOCTYPE
<!DOCTYPE MyDocs SYSTEM "filename.dtd">
|
이 예제에서는 요소 목록 파일의 이름이 filename.dtd이고 해당 파일이 사용자의
컴퓨터(SYSTEM, 공용 파일 위치를 가리키는 경우에는 PUBLIC)에
있다고 가정한다.
엔티티 사용하기
엔티티는 텍스트 또는 특수 문자로 이루어진 구일 수 있으며 내부 또는 외부를
가리킬 수 있다. 오류를 발생시키지 않고 엔티티를 올바르게 표시하려면 엔티티를 선언하고
올바르게 표현해야 한다.
컨텐츠에는 특수 문자를 직접 입력할 수 없다. 텍스트에 기호를 사용하려면 해당 문자
코드를 사용하여 특수 기호를 엔티티로 설정해야 한다. 회사 이름과 같은 구를 엔티티로
설정한 후 컨텐츠 내에서 엔티티를 입력할 수 있다. 엔티티를 설정하려면 먼저 엔티티 이름을
결정한 후 컨텐츠 내에 입력하면 된다. 엔티티의 형식은 앰퍼샌드(&)로
시작하고 세미콜론(;)으로 끝나야 한다(예: &coname;
또는 사용자가 지정한 이름). 그런 다음 Listing 6과 같이 DOCTYPE
안에 대괄호([])로 묶은 코드를 입력한다. 이 코드는 엔티티가 나타내는 텍스트를 식별한다.
Listing 6. ENTITY
<!DOCTYPE MyDocs SYSTEM "filename.dtd" [ <!ENTITY coname "Rabid Turtle
Industries"
]>
|
엔티티를 사용하면 같은 구나 정보를 반복해서 입력하지 않아도 된다. 자주 사용되는
회사 이름이 바뀌더라도 엔티티 정의에서 한 번만 조정해 주면 되기 때문에 텍스트를 손쉽게
조정할 수 있다.
오류 피하기
지금까지 XML 파일을 만들고, XML 편집기에서 열어서 잘 구성되어 있는지 검사하고,
XML 규칙을 따르고 있는지 확인하는 방법을 살펴보았다. 예를 들어 Windows® Internet
Explorer®를 사용하는 경우 XML 파일을 브라우저로 열 수 있다. 요소, 속성 및
컨텐츠가 브라우저에 표시되면 XML이 잘 구성되어 있는 것이다. 그렇지 않고 오류가
표시되는 경우에는 구문 오류가 있을 수 있으므로 문서에 오타가 있거나 태그나
구두점이 누락되지 않았는지 주의해서 검토해야 한다.
요소 중첩하기에서 설명한 대로 다른 요소를 포함하는 요소는 포함된
요소의 상위 요소이다. 아래 예제에서는 <recipe>가 루트
요소이고 파일의 전체 컨텐츠를 포함하고 있다. 이 상위 요소인 <recipe>에는
<recipename>, <ingredlist>,
<directions>를 포함한 다른 여러 요소가 포함되어 있다. 이
구조에서는 <recipename>, <ingredlist>
및 <directions>이 형제 요소이다. 형제 요소 또한
올바르게 중첩해야 한다는 점을 상기하기 바란다. Listing 7에서는 잘
구성되어 있고 올바르게 중첩된 XML을 보여 준다.
Listing 7. 잘 구성된 XML
<?xml version="1.0" encoding="UTF-8"?>
<recipe type="dessert">
<recipename cuisine="american" servings="1">Ice Cream Sundae</recipename>
<ingredlist>
<listitem><quantity units="cups">0.5</quantity>
<itemdescription>vanilla ice cream</itemdescription></listitem>
<listitem><quantity units="tablespoons">3</quantity>
<itemdescription>chocolate syrup or chocolate fudge</itemdescription></listitem>
<listitem><quantity units="tablespoons">1</quantity>
<itemdescription>nuts</itemdescription></listitem>
<listitem><quantity units="each">1</quantity>
<itemdescription>cherry</itemdescription></listitem>
</ingredlist>
<utensils>
<listitem><quantity units="each">1</quantity>
<utensilname>bowl</utensilname></listitem>
<listitem><quantity units="each">1</quantity>
<utensilname>spoons</utensilname></listitem>
<listitem><quantity units="each">1</quantity>
<utensilname>ice cream scoop</utensilname></listitem>
</utensils>
<directions>
<step>Using ice cream scoop, place vanilla ice cream into bowl.</step>
<step>Drizzle chocolate syrup or chocolate fudge over the ice cream.</step>
<step>Sprinkle nuts over the mound of chocolate and ice cream.</step>
<step>Place cherry on top of mound with stem pointing upward.</step>
<step>Serve.</step>
</directions>
<variations>
<option>Replace nuts with raisins.</option>
<option>Use chocolate ice cream instead of vanilla ice cream.</option>
</variations>
<preptime>5 minutes</preptime>
</recipe>
|
참고: 줄바꿈은 XML에 영향을 주지 않으면서도 코드를 쉽게 읽을 수 있도록 도와준다.
테스트 파일을 가지고 종료 태그와 시작 태그를 옮기면서 실험해 보자. 자주 하다 보면 결과
오류 메시지에 익숙해질 것이다.
XML 검토
그림 1에서는 Internet Explorer에 요소가 잘 표시된 모습을 보여
준다. 시작 태그와 종료 태그가 컨텐츠를 둘러싸고 있다. 상위 요소 옆에 있는 작은 더하기(+)
및 빼기(-) 기호를 사용해서 해당 요소 안에 중첩되어 있는
모든 요소(하위 요소)를 펼치거나 접을 수 있다.
그림 1. 일부 형제 요소가 접혀져 있는 샘플 XML 인스턴스(파일)
결론
XML은 규칙이 간단하며 XML 요소와 속성을 유연하게 설계할 수도 있다. XML의
규칙은 어렵지 않다. XML 문서를 입력하는 것도 어렵지 않다. 정렬 가능성과 검색
가능성의 측면에서 문서에 필요한 항목을 찾아낸 후 요구 사항에 맞춰 요소와 속성을
설계하는 작업이 가장 어려운 작업이다.
적합한 목표를 세우고 컨텐츠에 대한 마크업 방법을 결정한 후에는 효율적인 요소와
속성을 빌드할 수 있다. 이제부터 잘 구성되어 있고 유효한 XML을 만드는 데 필요한 것은
주의를 기울여서 태그를 지정하는 것만 남았다.
다운로드 하십시오 | 설명 | 이름 | 크기 | 다운로드 방식 |
|---|
| Example source code | example.zip | 2KB | HTTP |
|---|
참고자료 교육
제품 및 기술 얻기
- 제품 평가를 위한 IBM
시험판 소프트웨어: developerWorks에서 직접 다운로드할 수 있는 DB2®, Lotus®, Rational®, Tivoli® 및 WebSphere®의
애플리케이션 개발 도구 및 미들웨어 제품을 포함한 여러 가지 시험판 소프트웨어를 사용하여 차기 프로젝트를 빌드해 보기 바란다.
토론
필자소개  | 
|  | Kay Whatley는 기고가, 편집가이자 출판된 서적의 저자이다. 그녀는 XML Weekend Crash Course for Hungry Minds(Wiley, 2000)를 비롯한
여러 책의 공동 저자이고, Advanced FrameMaker(TIPS, 2004)의 책임 저자이며, XML and FrameMaker(Apress, 2004)의 저자이다. 그녀가 가장 최근에 발간한 기술 서적은 XML: Problem-Design-Solution(Wiley, 2006)이다. Kay는 책뿐만 아니라 산업 매거진과 웹 사이트에도 자주 기고하고 있다. 그녀의
연락처는 kaywhatley@aboveandbeyondlearning.com이다. |
기사에 대한 평가
 |
| 이 문서 북마킹 하기
|
|