이번에 XML대해서 한번 이야기 해볼까한다. 나도 제대로 배운것도 아니고, 수박 겉핥기 식으로 얕고 넓게 총체적이로 배운 것을 정리하려고한다. 그렇다면 XML은 무엇인가에 대해서부터 시작해보자.
* XML이란? Extensible Markup Language이다.
- XML의 발달 배경운 HTML과 SGML의 단점에서 비롯된다. 그렇다면 HTML과 SGML의 단점은 무엇이 있는가?
ⓐ HTML의 단점
> 고정된 Tag의 집합으로 구조화 능력이 부족하며, 단지 문서의 외형만 결정해준다.
> 구조화 능력이 부족한 탓에 저장 및 검색이 효과적으로 일어나지가 않는다.
ⓑ SGML의 단점
> 일단 너무 복잡하고 이식성이 낮아서 대중성이 없다.
> 복잡한 탓에 사용자의 DTD(Document Type Definition) 작성 또한 어렵다.
- 그렇다면 이런 단점을 극복한 XML의 장점에 대해서 알아보자.
ⓐ 간단함
ⓑ 확장성 - 새로운 Tag를 정의가 가능하며, 이를 이용해 표준 포멧을 정의할수 있다.
ⓒ 구조화 - 확장된 Tag로 문서를 구조화하기가 편리하다. 또한 이로 인해 검색과 저장이 용의하다.
ⓓ 독립성 - Text파일을 지원안해주는 플랫폼은 없다. 이에 따라 독립성 뿐만아니라 이식성도 높아 진다.
ⓔ 다중 하이퍼 링크가 가능하다.
ⓕ 문서의 재사용이 용의하다.
- 이러한 XML의 이용 분야는 다음과 같다.
ⓐ 데이터 교환, 프로토콜 구현 > 시스템 통합(SI:System Integration)
ⓑ 컨텐츠 데이터
ⓒ 웹 서비스(함수를 호출하는 것, 메세지를 주고 받는 것) : SOAP, WSDL, ODDI
* XML Core(XML 핵심)
- 규칙
ⓐ 규칙이 매우 엄격하다. 문법적인 규칙이 엄격하다.
ⓑ 반듯이 Start Tag에는 End Tag가 존재해야한다. 만약 self-closing의 경우에는 Tag 뒤에 닫아줘야한다.
ex) <name>Kim</name> // <red/>
ⓒ XML문서는 하나의 root element가 필요하다.
ⓓ whitespace를 인식하므로, 모든 불필요한 공백을 없엔다. 공백에 의해 에러가 발생한다.
※ xml로 시작하는 것은 사용을 "금지"한다. (이는 XML의 시스템 변수로 사용되고 있을 가능성이 높다.)
- 예제 소스
* XML이란? Extensible Markup Language이다.
- XML의 발달 배경운 HTML과 SGML의 단점에서 비롯된다. 그렇다면 HTML과 SGML의 단점은 무엇이 있는가?
ⓐ HTML의 단점
> 고정된 Tag의 집합으로 구조화 능력이 부족하며, 단지 문서의 외형만 결정해준다.
> 구조화 능력이 부족한 탓에 저장 및 검색이 효과적으로 일어나지가 않는다.
ⓑ SGML의 단점
> 일단 너무 복잡하고 이식성이 낮아서 대중성이 없다.
> 복잡한 탓에 사용자의 DTD(Document Type Definition) 작성 또한 어렵다.
- 그렇다면 이런 단점을 극복한 XML의 장점에 대해서 알아보자.
ⓐ 간단함
ⓑ 확장성 - 새로운 Tag를 정의가 가능하며, 이를 이용해 표준 포멧을 정의할수 있다.
ⓒ 구조화 - 확장된 Tag로 문서를 구조화하기가 편리하다. 또한 이로 인해 검색과 저장이 용의하다.
ⓓ 독립성 - Text파일을 지원안해주는 플랫폼은 없다. 이에 따라 독립성 뿐만아니라 이식성도 높아 진다.
ⓔ 다중 하이퍼 링크가 가능하다.
ⓕ 문서의 재사용이 용의하다.
- 이러한 XML의 이용 분야는 다음과 같다.
ⓐ 데이터 교환, 프로토콜 구현 > 시스템 통합(SI:System Integration)
ⓑ 컨텐츠 데이터
ⓒ 웹 서비스(함수를 호출하는 것, 메세지를 주고 받는 것) : SOAP, WSDL, ODDI
* XML Core(XML 핵심)
- 규칙
ⓐ 규칙이 매우 엄격하다. 문법적인 규칙이 엄격하다.
ⓑ 반듯이 Start Tag에는 End Tag가 존재해야한다. 만약 self-closing의 경우에는 Tag 뒤에 닫아줘야한다.
ex) <name>Kim</name> // <red/>
ⓒ XML문서는 하나의 root element가 필요하다.
ⓓ whitespace를 인식하므로, 모든 불필요한 공백을 없엔다. 공백에 의해 에러가 발생한다.
※ xml로 시작하는 것은 사용을 "금지"한다. (이는 XML의 시스템 변수로 사용되고 있을 가능성이 높다.)
- 예제 소스
<?xml version="1.0" encoding="euc-kr"?>
<person xmlns:people="html://destiny738.tistory.com" xmlns:name="html://destiny738.tistory.com"
xmlns:info="html://destiny738.tistory.com">
xmlns:info="html://destiny738.tistory.com">
//prefix:namespace에 대해서는 아래에 이어서 설명 될 것이다.
<people:name>
<name:first>Kim</name:first>
<name:middle>Chris</name:middle>
<name:last>Jin</name:last>
</people:name>
<people:age>23</people:age>
<people:info>
<info:title>Information</info:title>
<info:university>M University</info:university>
<info:number>010-****-****</info:number>
</people:info>
</person>
- 계층적 구조 : Ordered Tree의 형태를 취한다.
위 예제 소스를 트리로 나타내면 다음과 같다.
* XML NameSpaces
- 필요성 : Element나 Attribute의 이름들이 충돌할 가능성이 많다. 예를 보여주기위해 위의
예제 소스를 약간 고쳤다.
- 이렇게 태그간의 충돌을 막기위해서 나온 것이 Namespace!
> XML에서는 이러 한 것을 prefix라고 명명하여 부른다. prefix를 사용한 예를 보겠다.
이렇게 각 테그에 머릿말 처럼 namespace(prefix)를 이용하여 정의를 해준다.
하지만 위와 같은 간단한 소스에선 prefix만으로 충돌을 해결할 수 있겠지만, 소스가 여러 곳에서 개발되며
상대방이 어떠한 tag를 정의해서 사용하느냐에 따라서 prefix까지 충돌하는 경우가 발생한다.
이러한 것을 막기위해서 prefix에 uri를 이용하여 문제를 해결한다.
※ URI = URL + URN
URI를 지정하여 UNIQUE한 것을 제작함과 동시에 default prefix까지 정할 수 있다.
위 소스를 조금 고쳐서 예를 보여보겠다.
- 계층적 구조 : Ordered Tree의 형태를 취한다.
위 예제 소스를 트리로 나타내면 다음과 같다.
* XML NameSpaces
- 필요성 : Element나 Attribute의 이름들이 충돌할 가능성이 많다. 예를 보여주기위해 위의
예제 소스를 약간 고쳤다.
- 이렇게 태그간의 충돌을 막기위해서 나온 것이 Namespace!
> XML에서는 이러 한 것을 prefix라고 명명하여 부른다. prefix를 사용한 예를 보겠다.
<?xml version="1.0" encoding="euc-kr"?>
<person xmlns:people xmlns:name xmlns:info> // namespace 부여
<people:name>
<name:first>Kim</name:first>
<name:middle>Chris</name:middle>
<name:last>Jin</name:last>
</people:name>
<people:number>23</people:number>
<people:info>
<info:name>Information</info:name>
<info:university>M University</info:university>
<info:number>010-****-****</info:number>
</people:info>
</person>
이렇게 각 테그에 머릿말 처럼 namespace(prefix)를 이용하여 정의를 해준다.
하지만 위와 같은 간단한 소스에선 prefix만으로 충돌을 해결할 수 있겠지만, 소스가 여러 곳에서 개발되며
상대방이 어떠한 tag를 정의해서 사용하느냐에 따라서 prefix까지 충돌하는 경우가 발생한다.
이러한 것을 막기위해서 prefix에 uri를 이용하여 문제를 해결한다.
※ URI = URL + URN
URI를 지정하여 UNIQUE한 것을 제작함과 동시에 default prefix까지 정할 수 있다.
위 소스를 조금 고쳐서 예를 보여보겠다.
<?xml version="1.0" encoding="euc-kr"?>
<person xmlns="http://www.tistory.com/ xmlns:name="html://destiny738.tistory.com"
xmlns:info="html://destiny738.tistory.com">
//각각의 prefix에 url을 추가해주었다. 또한 아무런 prefix가 없는 것은 default에 의해 따로
//prefix 지정이 자동으로 된다.
<name>
<name:first>Kim</name:first>
<name:middle>Chris</name:middle>
<name:last>Jin</name:last>
</name>
<number>23</number>
<info>
<info:name>Information</info:name>
<info:university>M University</info:university>
<info:number>010-****-****</info:number>
</info>
</person>
* XPath
- XPath는 XML문서를 트리형식으로 취급하여 특정 element의 값을 선택가능하게 해준다.
(CSS의 selector와 비슷한 역할을 한다고 볼수 있군...)
- Path지정법
ⓐ 절대 경로 : "/"로 시작하여 root element로 부터 시작한다.
ⓑ 상대 경로 : 현재 context node로부터 상대적으로 찾아간다.
- 형태 : [Axis(내려가는방법)::]Node_Name(Predicate)*
ex)
order[customer] : order tag중에서 customer를 가진 tag
order[@number] : order tag중에서 attribute에 number를 가지고 있는 것
order[customer='kim'] : order tag중에서 customer의 값이 kim인 Tag
order[@number='123']/item/part-id[@id='abc']
: order tag중에서 number 속성이 123인것의 item 테그의 part-id 테그에서 id속성값이 abc 인 것
//car[make="kia" and year="2011"] : car tag의 모든 자식 노드 중 make값이 kia이고 year의 값이 2011인 것
/doc/chapter[5]/section[2] : doc tag의 chapter의 5번째 테그의 2번째 섹션
- 약어
ⓐ / : not or child
ⓑ // : 자신의 모든 자식 노드
ⓒ @ : Attribute
* : all element children
@* : all attribute
. : self node
.. : parent node
* XLS
- XML 문서를 다른 형태의 문서로 변경하는 XML based language
> 데이터 값은 같은데 tag가 다른 것에 용의(데이터 전환에 용의)
> 하나의 콘텐츠를 다양한 형태로 변형 가능
- XSLT : XSL Transformation & XSL-FO : XSL Formatting Object
* DTD (Document Type Definiton)
- 규칙을 지정할 수 있는 정의 방법
- 문법의 오류를 검사
- Validation 할 때 이용
> Well-formed(Tag가 잘 여닫여져 있는 것) + DTD
- 오래전에 나와서 부실하다.
ex)
<?xml version="1.0"?>
* XPath
- XPath는 XML문서를 트리형식으로 취급하여 특정 element의 값을 선택가능하게 해준다.
(CSS의 selector와 비슷한 역할을 한다고 볼수 있군...)
- Path지정법
ⓐ 절대 경로 : "/"로 시작하여 root element로 부터 시작한다.
ⓑ 상대 경로 : 현재 context node로부터 상대적으로 찾아간다.
- 형태 : [Axis(내려가는방법)::]Node_Name(Predicate)*
ex)
order[customer] : order tag중에서 customer를 가진 tag
order[@number] : order tag중에서 attribute에 number를 가지고 있는 것
order[customer='kim'] : order tag중에서 customer의 값이 kim인 Tag
order[@number='123']/item/part-id[@id='abc']
: order tag중에서 number 속성이 123인것의 item 테그의 part-id 테그에서 id속성값이 abc 인 것
//car[make="kia" and year="2011"] : car tag의 모든 자식 노드 중 make값이 kia이고 year의 값이 2011인 것
/doc/chapter[5]/section[2] : doc tag의 chapter의 5번째 테그의 2번째 섹션
- 약어
ⓐ / : not or child
ⓑ // : 자신의 모든 자식 노드
ⓒ @ : Attribute
* : all element children
@* : all attribute
. : self node
.. : parent node
* XLS
- XML 문서를 다른 형태의 문서로 변경하는 XML based language
> 데이터 값은 같은데 tag가 다른 것에 용의(데이터 전환에 용의)
> 하나의 콘텐츠를 다양한 형태로 변형 가능
- XSLT : XSL Transformation & XSL-FO : XSL Formatting Object
* DTD (Document Type Definiton)
- 규칙을 지정할 수 있는 정의 방법
- 문법의 오류를 검사
- Validation 할 때 이용
> Well-formed(Tag가 잘 여닫여져 있는 것) + DTD
- 오래전에 나와서 부실하다.
ex)
<?xml version="1.0"?>
<!DOCTYPE name [ <!-- name is root element -->
<!ELEMENT name (first,middle,last) > <!-- root has 3 tag, first, middle, last -->
<!ELEMENT first (#PCDATA) > <!-- first type is PCDATA -->
<!ELEMENT middle (#PCDATA) > <!-- middle type is PCDATA -->
<!ELEMENT last (#PCDATA) > <!-- last type is PCDATA -->
]>
<name>
<first>Kim</first>
<middle>Chris</middle>
<last>Jin</last>
</name>
* XML Schema
- 정의된 XML을 사용하는 법을 기술
- DTD의 업그레이드 버전
- XML Schema 또한 XML로 작성되있다.
- XML Schema는 NameSpace를 지원해준다.
- 다양한 Data Type을 지원한다.
- 상속이나 타입의 재사용이 가능하다.
* XML Schema
- 정의된 XML을 사용하는 법을 기술
- DTD의 업그레이드 버전
- XML Schema 또한 XML로 작성되있다.
- XML Schema는 NameSpace를 지원해준다.
- 다양한 Data Type을 지원한다.
- 상속이나 타입의 재사용이 가능하다.