본문 바로가기
etc../그 외

XML

by 최로이 2020. 12. 8.

XML(eXtensible Markup Language)

*기초

1. XML?

HTML과 비슷한 문자 기반의 마크업 언어다. 이 언어는 사람과 기계가 동시에 읽기 편한 구조로 되어 있다. 그러나 XML은 HTML처럼 데이터를 보여주는 목적이 아닌 데이터를 저장하고 전달할 목적으로만 만들어졌다. 

HTML과 다른 점이라면 HTML은 태그 형태로 사용할 수 있는 것이 정의되어 있지만 XML은 사용자가 직접 정의할 수 있다.

 

2. XML 특징

  1) XML은 다른 목적의 마크업 언어를 만드는 데 사용되는 다목적 마크업 언어다.

  2) 다른 시스템끼리 다양한 종류의 데이터를 손쉽게 교환할 수 있도록 해준다.

  3) 새로운 태그를 만들어 추가해도 계속해서 동작하므로, 확장성이 좋다.

  4) 데이터를 보여주지 않고, 데이터를 전달하고 저장하는 것만을 목적으로 한다.

  5) 텍스트 데이터 형식의 언어로 모든 XML 문서는 유니코드 문자로만 이루어져 있다.

 

3. XML 기반의 언어

  1) XHTML

  2) SVG

  3) RDF

  4) RSS

  5) Atom

  6) MathML

 

4. XML의 목적

서로 호환되지 않는 데이터 타입을 사용하는 시스템 간의 데이터 교환에는 많은 시간과 노력이 발생한다. 또한, 이렇게 데이터를 변환하는 과정에서 데이터의 손실이 발생한다. 하지만 XML은 데이터를 텍스트 형식으로 저장하므로, S/W나 H/W에 독립적으로 데이터를 저장하고 전달할 수 있다. 따라서 XML을 사용하면 새로운 운영체제나 프로그램, 브라우저 등에 상관없이 데이터를 안전하고 손쉽게 전달할 수 있다.


*기본

1. 구조

XML Architecture

위와 같이 XML은 트리(Tree)형태의 계층 구조를 가진다. 이런 XML 트리는 하나뿐인 루트(root) 요소부터 시작해, 각각의 자식(child) 요소에 차례대로 연결된다. XML 트리 구조에 포함되는 모든 요소는 자신만의 자식(child) 요소를 가질 수 있다.

 

이때, 부모(parent) 요소는 여러 개의 자식(child) 요소를 가질 수 있으며, 자식은 단 하나의 부모 요소만을 가질 수 있다.

 

형제(sibling) 요소는 같은 트리 레벨(tree level)에 존재하는 요소를 가리킨다. 즉, 형제 요소란 같은 부모 요소를 가지는 자식 요소 간의 관계를 나타낸다.

 

조상(ancestor) 요소란 부모 요소를 포함해 계측적으로 현재 요소보다 상위에 존재하는 모든 요소를 말한다. 반대로 자손 (descendant) 요소란 자식 요소를 포함해 계층적으로 현재 요소보다 하위에 존재하는 모든 요소를 말한다.

 

XML 트리의 모든 요소는 자신만의 텍스트나 속성을 가질 수 있다.

 

<?xml version="1.0" encoding="UTF-8"?>    //xml tag를 이용한 XML 문서 명시
<shop city="서울" type="마트">  //<shop> : 모든 요소의 조상 요소(root)겸 <food>의 부모 요소
    <food>                              //<food> : <name>, <sort>, <cost>의 부모 요소 겸 root요소의 자식 요소
        <name> 귤 </name>
        <sort> 과일 </sort>
        <cost>3000 </cost>
    </food>
    <food>
        <name> 상추 </name>
        <sort> 야채 </sort>
        <cost>2000 </cost>
    </food>
</shop>

 

2. 문법

XML 문서임을 명시하는 부분을 XML 프롤로그(prolog)라고 하며, 이때 사용하는 <xml> 태그명은 소문자 xml로만 사용해야 한다. XML의 프롤로그 문법은 다음과 같다.

 

1) 선언부

<? xml version="XML 문서 버전" encoding="문자셋" standalone="yes|no"?>
  • version 속성은 XML 버전 명시
  • encoding 속성은 XML 문서의 문자형태를 명시하며 기본값은 UTF-8로 설정
  • standalone 속성은 XML 문서가 외부 DTD(Document Type Definition)와 같은 외부 소스의 데이터에 의존하고 있는 문서인지 아닌지를 XML 파서(parser)에 알려주는 역할을 한다. 이 속성의 기본값은 no이며, yes로 설정하면 이 문서를 파싱(parsing)할 때 참조해야 할 외부 소스가 없다는 것을 의미한다.

 

 

2) 문법

XML 문서는 규칙적이고 예측할 수 있는 구조로 되어있다. 따라서 XML 문법은 배우기도 쉬우며 사용하기도 쉽다. 

 

① 모든 XML 요소는 종료 태그를 가져야 한다. HTML은 종료 태그를 생략해도 문제없이 동작하지만 XML은 종류 태그가 생략되면 오류가 발생한다. 또한 빈 태그에서도 반드시 슬래시(/)를 추가해야만 오류가 발생하지 않는다.

HTML : <h1> XML
          <hr>

XML  : <h1> XML </h1>
         <hr>
         <hr/>

② XML 태그는 대소문자를 구분한다. HTML 태그에서는 구분하지 않지만 XML에서는 태그명에서 대소문자를 구분하므로, 대소문자가 다르면 다른 요소로 인식한다.

<lecture>이 요소는 lecture 요소입니다. </lecture>
<Lecture>이 요소는 Lecture 요소입니다. </Lecture>  //대소문자를 가리므로 서로 다르게 인식

③ XML에서는 시작 태그와 종료 태그가 모두 대소문자까지 같아야 한다. XML에서는 태그명이 대소문자를 구분하므로 시작 태그와 종료 태그의 대소문자가 모두 같아야 한다.

 

④ XML 태그의 여닫는 순서는 반드시 지켜져야 한다. 여닫는 순서가 지켜진다는 것은 먼저 열린 태그는 그 안의 모든 태그가 닫힌 후에야 닫힐 수 있다는 의미다.

 

⑤ XML에서 속성 값은 반드시 따옴표로 감싸야한다. HTML은 감싸지 않아도 되지만 XML은 반드시 감싸야 한다.

<odc name=홍길동> //에러
<odc name="고길동">  //정상 동작

⑥ XML에서는 띄어쓰기를 인식한다. HTML에서는 띄어쓰기를 따로 인식하지 않는다. 하지만 XML에서는 여러 번의 띄어쓰기를 그대로 인식한다.

코드: <p>띄 어  쓰   기 </p>
HTML: 띄어쓰기 
XML: 띄어  쓰   기

 

3) XML 엔티티(Entity)

XML에서는 예약되어 있는 5개의 기호가 있다. 이렇게 예약되어 있는 기호를 XML 문서에서 사용하면 XML Parser(해석하는 기계)는 그것을 전혀 다른 의미로 해석한다. 따라서 이렇게 예약 기호를 기존에 사용하던 의미 그대로 사용하기 위해서 만든 문자셋을 엔티티(Entity)라고 한다.

기호 엔티티 명 16진수 엔티티 의미
< &lt; &#60; 보다 작은
> &gt; &#62; 보다 큰
& &amp; &#38; and 기호
" &quot; &#34; 큰따옴표
' &apos; &#39; 작은따옴표

 

4) 주석(Comment)

개발자가 작성한 해당 코드에 대한 이해를 돕는 설명이나 디버깅을 위해 작성한 구문으로 XML 코드의 어느 부분에도 작성할 수 있으며, XML 파서가 처리하지 않는다.

예제
기본 형식: <!-- 주석 내용 -->
<!-- 주석 -- 오류 발생 -->
<!-- 주석 - - 정상 인식 -->

5) XML 요소

XML 요소란 XML 문서를 구성하는 하나의 구성 요소로 정의할 수 있다. 각각의 XML 요소는 하나 이상의 다른 요소를 포함할 수 있다. 또한 텍스트, 속성, 미디어 객체나 경우에 따라 이들 전부를 포함할 수 있다.

<? xml version="1.0" encoding="UTF-8"?>
<school>
    <lecture category="application">
        <java> Java </java>
        <cpp> Cpp </cpp>
    </lecture>
    <lecture category="web">
        <php> PHP </php>
        <asp> ASP </asp>
    </lecture>
</school>

위의 예시에서 <java>, <cpp>, <php>, <asp> 요소는 각각 자신만의 텍스트를 가진다.

<school> 요소와 <lecture> 요소는 다른 요소들을 포함합니다. 또한, <lecture>요소는 category라는 속성을 갖는다.

 

요소 명의 속성은 시작 태그부터 종료 태그까지의 모든 것을 말한다.

XML 요소는 다음과 같은 문법을 사용하여 정의할 수 있다.

문법
<요소명 속성 1 = "속성 값 1" 속성 2="속성 값"...>  내용 </요소명>  // 요소에 대한 내용의 정의됐을 때
<요소명 속성 1 = "속성 값 1" 속성 2="속성 값"... />                              // 요소에  대한 내용의 정의되지 않았을 때

① XML 요소 명의 작성 규칙

② XML 요소명은 영문자, 숫자 하이픈(-), 언더스코어(_, underscore)와 점(.)만을 사용하여 작성해야 한다.

③ XML 요소명은 영문자나 대소문자를 구분한다.

④ 반드시 명문자나 언더스코어로 시작해야 하며, 공백을 포함할 수 없다.

⑤ 예약어인 xml, XML, Xml 등은 요소명으로 사용할 수 없다.

⑥ 시작 태그명과 종료 태그명은 반드시 대소문자까지 동일해야 한다.

 

6) XML 속성

XML 속성은 XML 요소에 대한 추가적인 정보를 제공하고, 해당 요소의 특징을 정의한다. XML 요소의 속성은 속성명="속성 값"의 형태로 정의되는데 꼭 따옴표로 둘러싸여야 한다.

<요소 이름 속성 1="속성 값" 속성 2="속성 값"... >

요소와 속성의 차이

예제 1(name을 XML 요소로 표현)
<student>
    <name> 홍길동 </name>
    <year>3 </year>
    <major> 컴퓨터공학 </major>
</student>

 

예제 2(name을 XML 속성으로 표현)
<student name="홍길동">
    <year>3 </year>
    <major> 컴퓨터공학 </major>
</student>

정보의 전달이라는 측면에서는 요소와 속성 두 가지 모두 출력하는 화면은 같지만, 속성은 여러 개의 값을 가질 수 없고, 요소처럼 쉽게 확장할 수 없다. 또한 속성은 XML 트리에 포함되지 않기 때문에 다양한 용도로 활용할 수 없다.

① XML 속성명은 하나의 요소 내에서 중복되어서 안 된다.

② 속성 값은 반드시 따옴표로 표기하여 표현해야 하며, 작은따옴표와 큰 따옴표의 차이는 없다.

 

XML 네임스페이스(Namespace)

XML 네임스페이스는 XML 요소 간의 이름에 대한 충돌을 방지해 주는 방법을 제공한다.

요소나 속성명을 하나의 그룹으로 묶어서 동일명에 대한 충돌을 해결한다.

URI(Uniform Resource Identifiers)로 식별한다.

URI(Uniform Resource Identifiers)
URI란 통합 자원 식별자를 의미하며, 인터넷에 있는 자원을 나타내는 유일한 주소를 의미한다.
URI의 존재는 인터넷에서 요구되는 기본 조건으로서 인터넷 프로토콜에도 항상 명시된다. 가장 잘 알려진 URI로는 인터넷 도메인 주소를 나타내는 URL(Uniform Resource Locator)이 있으며, 또 다른 URI로는 URN(Universal Resource Name)이 있다.

 

네임스페이스 예제 1
<root>   //root 태그 바깥에서 네임스페이스 선언

    <a:body xmlns:a="https://www.w3.org/TR/html5/">

        <a:h1> html에서의 제목 </a:h1>

        <a:p> html에서의 단락 </a:p>

    </a:body>

    <b:body xmlns:b="http://codingsam.com/xml/physical/">

        <b:arm>70 </b:arm>

        <b:leg>110 </b:leg>

    </b:body>

</root>

 

네임스페이스 예제 2
<root    //root 태그 내에서 네임스페이스 선언

    xmlns:a="https://www.google.com"    //a라는 접두사 선언 자식 요소에 각 네임스페이스의 접두사가 선언

    xmlns:b="https://www.tistory.com">    //b라는 접두사 선언

    <a:body>

        <a:h1> html에서의 제목 </a:h1>

        <a:p> html에서의 단락 </a:p>

    </a:body>

    <b:body>

        <b:arm>70 </b:arm>

        <b:leg>110 </b:leg>

    </b:body>

</root>

위와 같은 형태로 네임스페이스가 선언되면, 해당 요소의 모든 자식 요소에도 같은 네임스페이스가 선언된다. 이러한 네임 스페이스 선언은 XML 루트(root) 요소에서도 선언할 수 있다. 

 

 

'etc.. > 그 외' 카테고리의 다른 글

XML 파서(Parser)  (0) 2020.12.09
XMLHttpRequest  (0) 2020.12.09
XML DOM  (0) 2020.12.09
APNs  (0) 2020.11.17

댓글