Chap. 10 XML: Introduction

Introduction

• What is XML?

- XML stands for  eXtensible Markup Language.

- XML is a markup language much like HTML.

- XML was designed to 'describe' data.

- XML tags are NOT predefined. You must define your 'own' tags.

- XML uses a Document Type Definition (DTD) OR an XML Schema to describe the data.

- XML with a DTD or XML Schema is designed to be self-descriptive.

⇒

- HTML was designed to 'display' data and to focus on 'how' data looks.

- XML was designed to 'describe' data and to focus on 'what' data is.

• Web 상에서 'Data'를 교환하기 위한 Markup Language.

e.g. E-Commerce (전자상거래)

• What is a Markup Language?

- History

- SGML (Standard Generalized Markup Language): Markup language의 기원

⇒ Invented around 1970 by Charles F. Goldfarb.

- A notation for writing text with markup 'tags' (<tag>).

- Tags indicate the structure of the text.

- Tags have names and attributes.

- Tags may enclose a part of the text.

- XML1.0 in 1998

• HTML vs. XML

- HTML is about 'displaying' information, but XML is about 'describing' information.

⇒ Web상에서 구조적(structured) data를 표현.

⇒ Nested form (tree),

c.f. Can we express a tree structure on a table in the relational DB?

• Components of XML

① XML file (*.xml): data store.

②	DTD file(*.dtd): explain and descrbe XML file. (data의 구조를 표현)

③	style-sheet(*.xsl  *.css): publish on web. (output format을 표현)

⇒ CSS(Cascading Style Sheet)/XSL(eXtensible Style Language)

- We need a 'stylesheet' to define browser presentation semantics.

Ex) ①A Song Description in XML

<SONG>

<TITLE>Hot Cop</TITLE>

<COMPOSER>Jacques Morali</COMPOSER>

<COMPOSER>Henri Belolo</COMPOSER>

<COMPOSER>Victor Willis</COMPOSER>

<PRODUCER>Jacques Morali</PRODUCER>

<PUBLISHER>PolyGram Records</PUBLISHER>

<LENGTH>6:20</LENGTH>

<YEAR>1978</YEAR>

<ARTIST>Village People</ARTIST>

</SONG>

②A Style Sheet providing Formatting

SONG     {display: block }

TITLE	{display: block; font-family: Helvetica, serif;

font-size: 20pt; font-weight: bold }

COMPOSER {display: block;

font-family: Times, Times New Roman, serif;

font-size: 14pt; font-style: italic }

ARTIST   {display: block;

font-family: Times, Times New Roman, serif;

font-size: 14pt; font-weight: bold; font-style: italic }

PUBLISHER {display: block; font-size: 14pt;

font-family: Times, Times New Roman, serif }

LENGTH    {display: block;

font-family: Times, Times New Roman, serif;

font-size: 14pt }

YEAR      {display: block;

font-family: Times, Times New Roman, serif;

font-size: 14pt }

③Attaching a Style Sheet to a XML Document:	Processing Instruction

<?xml version="1.0"?>

<?xml-stylesheet type="text/css" href="song.css"?>

④Converter Program

- Style Sheets: Separate from the XML document

- Different Languages

□Cascading Style Sheets Level 1 (CSS1)

Internet Explorer 5.0

Mozilla 5.0

□Cascading Style Sheets Level 2 (CSS2)

Internet Explorer 5 (partial)

Mozilla 5.0 (partial)

□Extensible Style Language (XSL)

Internet Explorer 5.0 (older draft, buggy)

LotusXSL, XT, Other non-browser converters

□Document Style and Semantics Language (DSSSL)

Jade

- XSL

□It started with XSL and ended up with XSLT, XPath, and XSL-FO.

□XSL stands for eXtensible Stylesheet Language.

□The World Wide Web Consortium (W3C) started to develop XSL because there was a need for an XML based Stylesheet Language.

□Components

① XSLT(XSL Tranformations): XML 문서의 변환을 위한 언어

② XPath: XSLT가 XML문서의 각 부분에 접근하기 위해 필요한 언어

③ XSL Formating Objects: 포맷팅을 지정하는 XML표현 형식(어휘) 부분

Ex)

<!-- member.xml -->

<?xml version="1.0" encoding="euc-kr"?>

<?xml-stylesheet type="text/xsl" href="member.xsl"?>

<member>

<name> 김태영 </name>

<phone> 043-230-3749 </phone>

</member>

<!-- member.xsl -->

<?xml version="1.0" encoding="euc-kr"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">

<h2> 회원정보 </h2>

성명: <xsl:value-of select="member/name"/> <br/>

전화번호: <xsl:value-of select="member/phone"/> <br/>

</xsl:template>

</xsl:stylesheet>

□<template> 요소의 사용

XSLT를 사용해서 XML 문서를 변환하는 것은 하나의 트리구조를 다른 트리구조로 변환하는 것이다. 이 때 새로 만들어지는 트리를 구성하는 각각의 노드에 대한 정의를 하기 위해 <template> 요소를 사용한다.

중간에 match 속성값으로 ‘/’를 사용하는데, 이것은 이 템플릿이 ‘XML 문서 자체(루트 요소의 상위 개념)’에 매칭되는 정보를 지정한다는 것을 의미한다.

□위의 예처럼 XSL 스타일시트에서는 HTML 문법을 사용하여 스타일시트에서 나타내는 방법을 정의한다. 정확히 말하면 XSL에서 사용하는 HTML은 기존의 HTML을 XML 형식으로 변환한 XHTML(Extensible HyperText Markup Language)이다.

□XHTML은 HTML의 기능을 모두 가지고 있기 때문에 XML에서 XSLT를 사용한다는 것은 HTML의 모든 기능을 XML 문서를 표현하는데 사용할 수 있다는 것을 의미한다.

• Why the content and 'display' are 'separate' in XML?

① NO platform limit

② Multipurpose

• Application of XML

- XML is a 'meta-language' to create another languages

⇒ the main application of XML is making new languages.

- There are +1000 new markup languages made by XML.

Eg, www.schema.net

Ex1) XHTML: W3C's XMLization of HTML 4.0.

Ex2) CML: Chemical Markup Language

Ex3) MusicML, MathML, etc.

Ex4) The Resource Description Framework (RDF)

- Meta-data를 기술

⇒ Better Web searching

- Dublin Core에 기반

<rdf:RDF  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

xmlns:dc="http://purl.org/DC/>

<rdf:Description about="http://metalab.unc.edu/xml/>

<dc:CREATOR>Elliotte Rusty Harold</dc:CREATOR>

<dc:TITLE>Cafe con Leche</dc:TITLE>

</rdf:Description>

</rdf:RDF>

• Namespace

- Document에서 Element tag로 사용될 ‘유일한’ 이름을 각 조직에서 만들 수 있도록 함.

⇒ 각 tag나 attribute를 URL과 합쳐서 사용.

- 모든 tag에 긴 URL을 사용하는 것은 불편하기 때문에 Namespace 표준은 식별자에 대한 ‘축약’을 정의하는 방법을 제공함.

Ex) First Bank가 작성한 XML 문서가 다른 조직의 XML 문서의 tag와 중복되지 않으려면, URL 뒤에 콜론(:)을 붙여서 각 tag 이름 앞에 붙여서 사용함.

⇒ Root element <bank>는 ‘FB’를 아래에 주어진 URL에 대한 축약으로 정의하는 xml:FB 속성을 가짐.

<bank xmlns:FB="http://www.FirstBank.com">

……

<FB:branch>

<FB:branchname> Downtown </FB:branchname>

<FB:branchcity> Brooklyn </FB:branchcity>

</FB:branch>

……

</bank>

XML Document

• In XML file, the process is in 'three' steps:

#1: Edit XML file.

XML Softwares: XML Spy, visual XML,	XML writer, Xeena

#2: Test XML file

□Well-formed: the file itself is legal and follow the XML rules.

It should be a 'well-formed' file at least.

□Validating XML

It should have DTD file and the DTD file must 'correct'.

⇒	Well-formedness is a 'prerequisite' for validity

#3: Use XML file.

• An XML document is a 'text' with markup 'tags' and other meta-information.

① XML은 텍스트(Text) 포맷이다.

② 태그(Tag)로 관리되는 언어이다.

- element <book>: smallest unit in XML

- tags <book>.......</book>:  creat by user

- attribute

- contents

- comments: <!-- …………..-->

⇒ html과 같이 <!--로 시작하고 -->로 끝난다.

⇒ The parser will ignore the comment.

• Markup 'tags' denote 'elements':

..<foo attr="val" ...> bar </foo>..

a matching element 'end' tag

the contents "bar" of the element

an 'attribute' with name attr and value val, enclosed by ' or "

an element 'start' tag with name foo

- Attention:

□Tags can NOT start by numbers:  <123notebook>

□Tags can NOT have blank space on it.: <note book>

□Tags are case sensitive with "B" or "b":

<Notebook>……</notebook>: Incorrect

• Element vs. Attribute

- <mydocument lastupdate="2015/10/19>… </mydocument>

-	Attribute can also describe the XML content like element does.

⇒ The same information can be captured by EITHER 'Element' OR 'Attribute' in XML.

Ex) <style>lx2015</style> ⇔ style="lx2015"

Ex)

• An XML document must be 'well-formed':

- Start and end tags must 'match'.

- Element tags must be properly 'nested'.

Ex)

-	The XML declaration (1st line) should always be included.

- Root element is <note>.

-	In XML all elements must have a closing tag:

<p>foo<p>bar => <p>foo</p><p>bar</p>

- XML tags are case sensitive: 대소문자 구분

<Message>This is incorrect</message>

- XML all elements must be properly 'nested' within each other:

<b><i>This is incorrect</b></i>

• Well-formedness Rules

① Open and close all tags:

- 여는 태그가 있으면 반드시 닫는 태그가 있어야 한다.

- If an element contains a start tag for an element, it must also contain the corresponding end tag

Ex)	<book>Ontology</book>

② Empty tags end with />

- Empty elements may appear anywhere

Ex)	<book title="Ontology" /> 내용(contents)을 갖지 않는 경우.

(<BR/>, <HR/>, and <IMG/> instead of <BR>, <HR>, and <IMG>

Web browsers deal inconsistently with these

Can use <BR></BR> <HR></HR> <IMG></IMG> instead.)

③ There is a unique root element

- 한 개 이상의 태그를 가져야 하고, 루트(root) 요소는 하나만 허용

- Every non root element has a parent element

- One element completely contains all other elements of the document

- This is HTML in HTML files

- XML Declaration is NOT an element

Ex)	<?xml version="1.0" standalone="yes"?>

<GREETING>

Hello XML!

</GREETING>

④ Elements may NOT overlap

- 태그의 오버랩 허용 안 함: <B><I>TEST</B></I>은 틀림

⑤ Attribute values are quoted

Good: <A HREF="http://metalab.unc.edu/xml/">

Bad:  <A HREF=http://metalab.unc.edu/xml/>

⑥ < and & are only used to start tags and entities

Good:	<H1>O'Reilly &amp; Associates</H1>

Bad:	<H1> O'Reilly & Associates</H1>

Good:	<CODE>for (int i = 0; i &lt;= args.length; i++ ) { </CODE>

Bad:	<CODE>for (int i = 0; i <= args.length; i++ ) { </CODE>

⑦ Only the five predefined entity references are used

Good: &amp;	&lt;	&gt; &quot; &apos;

Bad: &copy; &reg; &tm; &alpha;	&eacute;	&nbsp etc.

• An Example

1) The Root Element

- Choose SEASON for the root element

- Everything else will be a descendant of SEASON

- This is NOT the only possible choice

<?xml version="1.0"?>

<SEASON>

</SEASON>

1-1) Child Elements

<?xml version="1.0"?>

<SEASON>

<YEAR> 2015 </YEAR>

</SEASON>

1-1-1) Leagues

Major league baseball is divided into two leagues

Each league has

- Name

- Three divisions

1-1-1-2) Divisions

Each division has

- Name

- 4-6 teams

1-1-1-2-2) Teams

Each team has a

- Name

- City

- Players

1-1-1-2-2-3) Player

Each player has

- First name

- Last name

- Position

- Batting Statistics

1-1-1-2-2-3-4) Batting Statistics

- G   Games Played

- GS Games Started

- AB At Bats

- R	Runs

- H	Hits

- 2B	Doubles

- 3B	Triples

- HR	Home Runs

- RBI Runs Batted In

- SB  Stolen Bases

- CS  Caught Stealing

- SH  Sacrifice Hits

- SF  Sacrifice Flies

- Err  Errors

- PB	Pitcher Balked

- BB	Base on Balls (Walks)

- SO	Strike Outs

- HBP Hit By Pitch

DTD

• Schema Language

- A schema is a definition of the syntax of an XML-based language

⇒ A schema language is a formal language for expressing 'schemas'.

- Schema processing: Given an XML document and a schema, a schema processor checks for 'validity',

⇒ the document 'conforms' to the schema requirements.

-	Many proposals competing for acceptance

① W3C Proposals: DTD, XML Data, DCD, DDML, SOX, XML-Schema, …

② Non-W3c Proposals: Assertion Grammars, Schematron, DSD, TREX, RELAX, RELAX-NG, …

-	Difficult to choose one:

□it is an inherently difficult problem.

□people have different needs from a schema language.

□the official (W3C) proposals are NOT very good … yet !

• DTD: Document Type Definition

-	XML DTD is a subset of SGML DTD.

-	XML DTD is the standard XML Schema Language of the past and present.

□It is one of the simplest and least expressive schema languages proposed for XML model.

□It does NOT use XML tag notation, but use its own weird notation.

□It cannot express relatively complex constraint (eg, key) well.

□It is being replaced by XML-Schema of W3C and RELAX-NG of OASIS.

Ex)	greeting.xml:

<?xml version="1.0"?>

<GREETING>

Hello XML!

</GREETING>

greeting.dtd:

<!ELEMENT GREETING (#PCDATA)>

① Valid XML document:

<GREETING>

various random text but no markup

</GREETING>

② Invalid: anything else including

<GREETING>

<sometag>various random text</sometag>

<someEmptyTag/>

</GREETING>

OR

<GREETING>

<GREETING>various random text</GREETING>

</GREETING>

Ex) event.dtd

⇒ 요소(element)와 속성(attribute)의 형식을 정의함.

• Elements

-	Each tag must be declared in a <!ELEMENT> declaration.

-	<!ELEMENT> declaration gives the name and content model of the element

⇒ <!ELEMENT element-name content-model> associates a content model to all elements of the given name content models:

- Content models:

□EMPTY: no content is allowed.

Ex)	<!ELEMENT BR EMPTY>

<!ELEMENT IMG EMPTY>

<!ELEMENT HR EMPTY>

□ANY: any content is allowed.

Ex) <!ELEMENT SEASON ANY>

A SEASON can contain any child element and/or raw text (parsed character data)

□(#PCDATA|element-name|...): "mixed content", arbitrary sequence of character data and listed elements.

⇒ Parsed Character DATA (문자데이터 i.e. raw text, no markup)

Ex) <!ELEMENT YEAR (#PCDATA)>

Valid:

<YEAR>2015</YEAR>

<YEAR>15</YEAR>

<YEAR>2015 A.D.</YEAR>

<YEAR>

The year of our Lord one thousand, nine hundred, and ninety-nine

</YEAR>

Invalid:

<YEAR>

<MONTH>January</MONTH>

<MONTH>February</MONTH>

<MONTH>March</MONTH>

<MONTH>April</MONTH>

<MONTH>May</MONTH>

<MONTH>June</MONTH>

<MONTH>July</MONTH>

<MONTH>August</MONTH>

<MONTH>September</MONTH>

<MONTH>October</MONTH>

<MONTH>November</MONTH>

<MONTH>December</MONTH>

</YEAR>

□Child element:

Ex) To declare that a LEAGUE element must have a LEAGUE_NAME child:

<!ELEMENT LEAGUE (LEAGUE_NAME)>

<!ELEMENT LEAGUE_NAME (#PCDATA)>

□The content model uses a simple ‘regular expression-like grammar’ to precisely specify what is and isn't allowed in an element

⇒ Regular expression over element names: sequence of elements matching the expression.

choice: (...|...|...)

sequence: (... , ... , ...)

optional: ...?

zero or more: ...*

one or more: ...+

Sequences

Separate multiple required child elements with commas;

e.g.	<!ELEMENT SEASON (YEAR, LEAGUE, LEAGUE)>

<!ELEMENT LEAGUE (LEAGUE_NAME, DIVISION, DIVISION, DIVISION)>

One or More Children +

<!ELEMENT DIVISION_NAME (#PCDATA)>

<!ELEMENT DIVISION (DIVISION_NAME, TEAM+)>

Zero or More Children *

<!ELEMENT TEAM (TEAM_CITY, TEAM_NAME, PLAYER*)>

<!ELEMENT TEAM_CITY (#PCDATA)>

<!ELEMENT TEAM_NAME (#PCDATA)>

Choices

<!ELEMENT PAYMENT (CASH | CREDIT_CARD)>

<!ELEMENT PAYMENT (CASH | CREDIT_CARD | CHECK)>

Grouping With Parentheses

Parentheses combine several elements into a single element.

Parenthesized element can be nested inside other parentheses in place of a single element.

The parenthesized element can be suffixed with a plus sign, a comma, or a question mark.

<!ELEMENT dl (dt, dd)*>

<!ELEMENT ARTICLE (TITLE, (P | PHOTO | GRAPH | SIDEBAR |	PULLQUOTE | SUBHEAD)*, BYLINE?)>

Mixed Content

Both #PCDATA and child elements in a choice

<!ELEMENT TEAM (#PCDATA | TEAM_CITY | TEAM_NAME | PLAYER)*>

#PCDATA must come first

#PCDATA cannot be used in a sequence

- Internal DTDs: XML 문서내에서 자신의 DTD를 정의하려면 문서의 프롤로그 영역에서 DOCYPE 키워드를 사용한다.

<?xml version="1.0"?>

<!DOCTYPE GREETING [

<!ELEMENT GREETING (#PCDATA)>

]>

<GREETING>

Hello XML!

</GREETING>

- Internal DTD Subsets: Internal declarations override external declarations

<?xml version="1.0"?>

<!DOCTYPE GREETING SYSTEM "greeting.dtd" [

<!ELEMENT GREETING (#PCDATA)>

]>

<GREETING>

Hello XML!

</GREETING>

Ex) XML document that conforms to "event.dtd"

• Attributes

- <!ATTLIST element-name attr-name attr-type attr-default ...> declares which attributes are allowed OR required in which elements attribute types:

① 문자열:

CDATA: any value is allowed (the default).

<!ATTLIST element_name attribute_name CDATA default>

Ex)	<!ATTLIST book ISBN CDATA "89-7627-757-0">

<book ISBN="89-8078-122-9">The Hobbit</book>

② 열거형:

(value|...): enumeration of allowed values. (나열된 값 중 하나 선택)

<!ATTLIST element_name attribute_name (value1|value2|value3...) default>

Ex) <!ATTLIST book type (a1|a2|b1|b2) #IMPLIED>

<book type="a1">The Hobbit</book>

<book type="b2">The Hobbit</book>

③ ID, IDREF, IDREFS:

ID attribute values must be unique (contain "element identity"),

IDREF attribute values must match some ID (reference to an element).

<!ATTLIST element_name attribute_name ID default>

Ex) <!ATTLIST book cdnum ID default>

<book cdnum="a106">The Hobbit</book>

IDREF는 문서 내부에서 이전에 선언된 유일한 ID를 지시. 만일 문서 내부에 위에서 선언한 부분이 포함된다면 ID값을 참조할 수 있음.

Ex) <!ATTLIST part ref IDREF default>

<part ref="a106">part one</part>

④ ENTITY, ENTITIES:

Entity와 Entities는 애트리뷰트 값으로 객체를 삽입하기 위한 방법. 이들 타입을 사용하기 위해서 먼저 DTD내에 객체를 선언해야 함.

Ex) book의 attribute 값으로 그림객체를 삽입할 경우.

<!ENTITY im01 SYSTEM "im01.gif" NDATA gif>

<!ATTLIST book img ENTITY default>

<book img="im01">test book</book>

⑤ NMTOKEN, NMTOKENS, NOTATION:

NMTOKEN, NMTOKENS: 공백글자를 허용하지 않는다는 점을 제외하고는 문자열과 동일.

⇒ 따라서, 사용자의 입력값을 확인하는데 유용. 예를 들어 자동차 번호, 주민등록번호, 신용카드번호와 같이 공백없는 데이터의 입력에 유용.

NMTOKEN: 하나의 NMTOKEN값만을 허용.

Ex)	<!ATTLIST car license NMTOKEN default>

<car license="HDF321-00">Berna</car>

NMTOKENS: 하나이상의 NMTOKEN 값을 허용.

- Attribute defaults:

① #REQUIRED: the attribute must be explicitly provided.

Attribute 값을 반드시 가져야 한다는 것을 의미.

② #IMPLIED: attribute is optional, no default provided.

Attribute 값이 올것을 결정하지 못한 경우에 사용.

Attribute 값의 유무에 상관없이 에러도 발생하지 않음.

③ "value": if not explicitly provided, this value inserted by default.

Supplied Attribute를 사용하게 될 경우 XML문서 내에서 값을 제공하지 않으면 DTD가 값을 제공.

Ex)	<!ATTLIST jj color(red|green|blue) "red">

<jj color="blue"></jj> 또는 <jj/> 와 같이 사용할 수 있는데 후자의 경우 color="red"를 사용.

④ #FIXED "value": as above, but only this value is allowed.

Attribute를 정의한 후에 XML문서 내에서 Attribute 값을 갖는 어떤 다른 값으로 변경할 수 없도록 함.

만일 XML 문서 내부에서 Attribute 값을 공백으로 두면 default 값을 사용.

Ex) <!ATTLIST person mood CADTA #FIXED "Happy">

다음 두가지 경우만 가능.

<person mood="Happy">man</person>

또는 <person>man</preson>

Ex)

실습문제

• 다음과 같은 형태로 다음과 같은 형태로 제품 정보가 반복된다면, 이 정보를 저장할 DTD를 만들어 보자. (단, 제품번호는 유일성이 보장되어야 하고, 포장단위는 생략할 수 있다. 다른 항목은 모두 한 번씩 나타나야 한다.)

제품번호:	H0031

제조명:	필립스 면도기

제조회사:	필립스

판매가격:	52000

매장위치:	3A-5

제품번호:	H0033

제조명:	디스켓

제조회사:	3M

포장단위:	10EA

판매가격:	4000

매장위치:	3A-5

XML Tools

• XML Parser: XML 문서가 문법적으로 올바른지 검사하고, 다양한 애플리케이션이 XML 문서의 내용과 구조에 접근할 수 있도록 지원. (XML Preprocessor)

Apache Xerces - XML parsers in Java, C++

Expat - XML parser in C

• Programming API: Java works best.

⇒ C, Perl, Python etc. can also be used.

⇒ Unicode support is the biggest issue.

- SAX (Simple API for XML)

Event-based

Programs can plug in different parsers.

-	DOM (Document Object Model)

• Transformation: XSLT

Apache Xalan XSLT stylesheet processors

• XML Database

dbXML, QuiP, …

• More

www.xmlsoftware.com

java.sun.com

• Plenty of research issues for Database Researchers

- XML query language issue

-	Conversion issue between XML and other (eg, relational) models

-	Storage issue for native XML database

-	Novel indexing issue

-	System design and implementation issue

-	http://www-db.stanford.edu/~widom/xml-whitepaper.html

• Further References

-	World-Wide Web Consortium: www.w3c.org/xml/

-	XML Cover Page: www.oasis-open.org/cover/

-	XML Articles: www.xml.com

-	Latest XML News: www.xmlhack.com

-	XML Tutorial: www.w3schools.com/xml/default.asp

-	XML Tutorial: www.brics.dk/~amoeller/XML/

-	XML Tutorial: www.xml101.com/xml/default.asp

-	This slide is available at http://www.cobase.cs.ucla.edu/projects/xpress/

XML Schema

• Why XML Schema?

- DTD의 문제점

① XML 문법을 따르지 않고 ‘독자적인’ 문법을 가지고 있다.

② 다양한 종류의 데이터 타입을 지원하지 않는다.

③ DTD는 XML에서 기본이 되는 이름공간(namespace)을 지원하지는 못한다.

- XML 스키마(schema): XML 문서의 ‘구조’를 정의하는 기술

⇒ DTD의 문제점 해결

- 특징

- MSXML 4.0 이상 버전의 파서: XSD라고 불리는 W3C 표준 스키마 지원

Ex)

• XML Schema와 DTD와의 비교

Ex1) p.369 Fig.10.6: DTD (Silberschatz 4th ed.)

<!DOCTYPE bank [

<!ELEMENT bank ( (account customer depositor)+)>

<!ELEMENT account ( account-number branch-name balance )>

<!ELEMENT customer ( customer-name customer-street customer-city )>

<!ELEMENT depositor ( customer-name account-number )>

<!ELEMENT account-number ( #PCDATA )>

<!ELEMENT branch-name ( #PCDATA )>

<!ELEMENT balance ( #PCDATA )>

<!ELEMENT customer-name ( #PCDATA )>

<!ELEMENT customer-street ( #PCDATA )>

<!ELEMENT customer-city ( #PCDATA )>

]>

Ex2) p.372 Fig.10.8: XML Schema (Silberschatz 4th ed.)

<?xml version="1.0" ?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="bank" type="BankType"/>

<xsd:element name="account">

<xsd:complexType>

<xsd:sequence>

<xsd:element name="account-number" type="xsd:string"/>

<xsd:element name="branch-name" type="xsd:string"/>

<xsd:element name="balance" type="xsd:decimal"/>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

<xsd:element name="customer">

<xsd:complexType>

<xsd:sequence>

<xsd:element name="customer-number" type="xsd:string"/>

<xsd:element name="customer-street" type="xsd:string"/>

<xsd:element name="customer-city" type="xsd:string"/>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

<xsd:element name="depositor">

<xsd:complexType>

<xsd:sequence>

<xsd:element name="customer-name" type="xsd:string"/>

<xsd:element name="account-number" type="xsd:string"/>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

<xsd:complexType name="BankType">

<xsd:sequence>

<xsd:element ref="account" minOccurs="0" maxOccurs="unbounded"/>

<xsd:element ref="customer" minOccurs="0" maxOccurs="unbounded"/>

<xsd:element ref="depositor" minOccurs="0" maxOccurs="unbounded"/>

</xsd:sequence>

</xsd:complexType>

</xsd:schema>

⇒ minOccurs/maxOccurs를 사용하여 하위요소가 최소/최대 몇 번 나타날 수 있는가를 정의함. (default는 1)

- DTD와 비교한 XML Schema의 잇점

□그 자체가 XML 문법을 따르고 있다.

□사용자 정의형을 만들 수 있도록 한다.	Ex2) BankType

□요소(element)에 나타나는 텍스트가 ‘정해진 형태의 수식 type(xsd:string/ xsd:decimal 등)'이거나 배열(xsd:sequence)이나 공용체와 같은 더 복잡한 type처럼 특정한 type으로 제한할 수 있다. 형(type)이 예를 들어 최대값과 최소값을 정하는 것처럼, 특별한 형을 만들도록 제한할 수 있다.

□상속의 형태를 사용하여 복합형(xsd:complexType)이 확장될 수 있도록 한다.

□DTD의 수퍼집합이다.

□유일성과 외래 키 제약을 가능하게 한다.

□namespace를 사용하여 문서의 다른 부분들이 각기 다른 스키마를 따르도록 할 수 있다.

• XML Schema의 구조

- 요소(element) 선언

①<complexType> 요소 사용: 자식 요소가 있거나, 속성이 있는 요소 선언할 때.

②<simpleType> 요소 사용: 단지 문자 데이터만 갖는 요소 선언할 때.

③형(type)은 이미 만들어진 type을 요소의 type으로 지정.

- 복합자(compositor):  요소그룹을 구성하는 요소 또는 요소그룹(요소그룹은 다른 요소그룹의 일부가 될 수 있다)이 XML 문서에서 어떤 방법으로 조합되어야 하는가를 지정.

①sequence 복합자 : 요소그룹의 요소들이 스키마에 나타난 ‘순서대로’ 나타나야 함.

②choice 복합자 : 요소나 요소 그룹 사이에서 하나를 선택하고자 할 때 사용.

③all 복합자 : 요소그룹을 구성하는 요소들이 ‘순서대로 나타날 필요가 없을 때’ 사용.

- 아래의 스키마는 요소를 정의하기 위해 <complexType> 요소를 사용했을 때, 그 안에 자식 요소를 정의하기 위해 또 <complexType> 요소를 사용할 수 있음을 나타냄.

- 따로 선언된 타입의 사용: 앞에서 살펴본 구조정의 방식은 트리(tree)의 가지가 많아지고, 깊어지면 스키마 내용이 너무 복잡하고 난해함.

⇒ XML스키마에서는 다른 곳에서 타입을 선언하고, 그것을 사용하는 방법을 지원함.

⇒ 이런 방식으로 한 번 선언한 타입을 서로 다른 곳에서 여러 번 사용이 가능함.

- 속성(attribute) 선언: 속성을 가진 요소를 선언하려고 할 경우에도 <complexType> 요소를 사용해야 한다.

Ex) 자식 요소와 속성을 가지는 요소의 선언

주의할 사항은 속성 선언이 요소 선언보다 반드시 뒤에 나타나야 한다는 사실.

- XML 스키마의 데이터 타입: XML 스키마는 DTD에 비해 훨씬 상세하게 데이터 타입을 지정할 수 있을 뿐만 아니라 요소의 문자 데이터의 데이터 타입을 지정할 수 있다.

- 데이터 타입의 유도(derivation)

□XML 스키마에서 모든 타입은 복합타입(complex type)과 단순타입(simple type) 두 가지 중 하나이다.

□복합타입은 요소를 통해 선언되는데, 앞에서 보아 온 것처럼 복합타입으로 선언된 요소는 하위 요소나 속성을 가지고 있었다. 반대로 단순타입은 자식요소나 속성을 가질 수 없다. XML 스키마의 '내장 데이터 타입'은 모두 단순타입에 속한다.

□그런데 XML 스키마는 이미 존재하는 단순타입을 기반으로 '새로운' 단순타입을 만들어 주는 기능을 지원한다. 이런 기능을 데이터 타입의 유도(derivation)라고 한다.

- 패싯(facet)의 의미 (='일면', phase)

□length 길이, minLength 최소길이, maxLength 최대길이, pattern 패턴,

⇒ pattern 패싯은 매우 강력한 기능을 갖고 있는데, 일치해야 하는 특정 패턴을 지정.

□enumeration 유효한 값의 리스트, whiteSpace 값의 공백처리 제어,

□maxInclusive 최대값, maxExclusive 입력 불가능한 값 중 최소값,

□minExclusive 입력 불가능한 값 중 최대값, minInclusive 최소값,

□totalDigits 숫자 최대 자릿수(소수점이하 포함), fractionDigits 소수점 이하 최대자릿수

⇒ 앞의 3자리는 반드시 나타나야 하지만 뒤의 -부호로부터 뒤의 3자리 수는 생략될 수도 있기 때문에 소괄호를 쓰고 물음표를 써서 생략이 가능하다는 표시.

-유니온(union)과 리스트(list)는 제한(restriction)과 더불어 유도를 구현하는 다른 방법

□<union>요소를 이용하면 연합을 구현할 수 있는데, 연합이란 여러 개의 단순 타입(simpletype)을 합해서 데이터 타입에서 가질 수 있는 값의 범위를 확장하는 것)

□리스트(list)는 공백으로 구분되는 값의 리스트를 담을 수 있는 데이터 타입을 만듦.

- 다양한 내용 모델(content model)의 구현

□자식요소나 문자 데이터가 없는 내용(empty content)

□문자데이터와 속성만 가지는 간단한 내용(simple content)

□하위요소, 속성, 문자 데이터를 모두 가지는 혼합 내용(mixed content model)

- Identity 제약(Identity-constraint)

□ID 데이터 타입을 이용해서 유일성 지정하는데는 2가지 문제

① 유일성 확보하기 위해서는 반드시 ID라는 데이터 타입 써야함.

⇒ ID타입은 상당히 제약이 많아서 값이 숫자로 시작 못하고, 데이터 중간에 공백 못옴

② ID타입은 유일성 확인을 전체 문서 범위에서 함.

⇒ 2개의 서로 다른 ID타입 지정할 경우, 서로 다른 데이터 사이에도 중복값이 있으면 유효하지 않은 문서가 되어 버림

그래서...

① xsd:key : 특정한 요소나 속성의 값에 유일성을 보장하기 위해선 <key>요소 사용 가능

② xsd:keyref : <keyref>요소는 <key>요소로 유일성을 설정한 데이터를 '참조'하는 용도로

③ xsd:unique: <unique>요소는 <key>요소와 마찬가지로 값의 유일성을 지정하는데 사용

Ex) 실습문제

다음과 같은 내용을 가진 XML 문서의 스키마를 만들어 보자.

단, 주문은 1건 이상 100건 이하의 주문내역(제품정보)을 포함해야 한다. 특기사항은 1회 나타나거나 아예 나타나지 않을 수도 있고, 나머지 항목은 범위 내에서 1회씩 나타나야 한다. 주문내역에서 제품번호는 유일해야 한다.