프로그래밍[Univ]/기타

[XML] XML이란?

Cloud Travel 2011. 11. 29. 03:08
이번에 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">
  //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를 사용한 예를 보겠다.
<?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"?>
<!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을 지원한다.
 - 상속이나 타입의 재사용이 가능하다.