Post

XML과 친해지기

XML과 친해지기

XML이란

데이터를 저장하고 전달하는 문서와 같다. XML을 통해 데이터 구조를 언어로 쉽게 기술할 수 있다.

  • 새로운 태그를 만들 수 있다.
  • 데이터를 보여주는 것이 아닌, 전달 및 저장을 주목적으로 한다.
  • 유니코드 문자로만 구성되어있다.

(+) SGML / HTML / XML / SVG / XHTML 등의 개념 층위?

왜 XML인가?

데이터를 교환화는 과정에서 호환되지 않는 데이터 타입으로 인한 충돌, 변환 과정에서의 왜곡 및 손실 등이 발생한다. XML은 “텍스트”의 통일된 형태이므로 데이터의 저장 및 전달에 유용하다. (운영체제, 프로그램 등의 종류로부터 자유롭기 때문)

기타 이점 참고: https://velog.io/@dbekdms17/파싱

XML의 구성

  • 트리 형태의 계층 구조를 갖는다. 최상위에 유일한 root요소와, 이후 부모-자식 관계로 연결되어있는 요소들로 이루어져 있다.
  • 하나의 부모는 여러 개의 자식을 가질 수 있지만, 하나의 자식이 여러 개의 부모를 가질 수는 없다.
  • 모든 요소가 자식을 가질 수 있다.
  • 모든 요소가 텍스트와 속성을 가질 수 있다.

XML의 문서 구조

xml 태그를 통해 문서 형식을 명시한다.

1
<?xml version="1.0" encoding="UTF-8"?>

xml 태그 직후의 요소는 root를 의미한다. 아래의 예제에서는 shop태그에 해당한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<shop city="서울" type="마트">

    <food>

        <name></name>

        <sort>과일</sort>

        <cost>3000</cost>

    </food>

    <food>

        <name>상추</name>

        <sort>야채</sort>

        <cost>2000</cost>

    </food>

</shop>

위의 예제를 간단한 트리 형태로 추상화해보자. 형제와 부모 관계가 더욱 명확해진다.

IMG_2162-1.jpg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[
  '<shop city="서울" type="마트">',
  '<food>',
  '<name>',
  '</name>',
  '<sort>',V
  '</sort>',
  '<cost sale="true">',
  '</cost>',
  '</food>',
  '<food>',
  '<name>',
  '</name>',
  '<sort>',
  '</sort>',
  '<cost>',
  '</cost>',
  '</food>',
  '</shop>'
]

XML의 세부 문법

XML 문서를 명시하는 XML 프롤로그가 있다. 태그로 표현하며, 소문자만 허용

  • version: XML의 문서버전이다. (마지막 버전은 1.1) 필수
  • encoding: 문자셋을 명시한다. (기본값은 UTF-8) 옵션
  • standalone: 외부 소스의 데이터에 의존하고 있지 않은지의 여부다. (기본값은 no다) 옵션 yes면 외부 소스 참고할 필요가 없는 것
1
<?xml version="XML문서버전" encoding="문자셋" standalone="yes|no"?>

XML 규칙 (요구사항에 명시된 스펙과 함께 정리 *)

주석

✅ !으로 시작하면 주석으로 인식하여 저장하지 않는다

(+) 주석 내용 안에 두 개의 연속된 하이픈-이 존재하면 오류로 인식한다.

(+) 중첩하여 주석을 작성할 수 없다.

엘리먼트

시작태그부터 종료 태그까지의 모든 것을 의미한다.

✅ 모든 요소는 종료 태그를 가진다. (이외의 경우는 오류다.)

빈 태그도 반드시 슬래시를 통한 self-closing을 해야 한다. ✅ 대소문자를 구분한다. 따라서, 시작 종료 태그의 대소문자까지 일치해야 한다.

✅ 태그의 여닫는 순서가 반드시 지켜져야 한다.

✅ 속성은 반드시 따옴표로 감싸야 한다.

✅ 태그 내부 텍스트의 띄어쓰기를 인식한다.

  • 지원하는 XML 태그 스펙
    • 도입부 Prolog : <?xml> 처럼 앞이 ?로 시작하면 XML에 대한 정보. 내부에 저장할 때는 prolog 항목에 저장한다.
    • 주석 Comment : <!DOCTYPE> 처럼 앞에 !로 시작하면 XML 주석으로 처리하고 저장하지 않는다.
    • 요소 Element : <HTML> 또는 <plist> 처럼 < 바로 다음에 나오는 한 단어는 요소 element로 처리한다.
      • 모든 요소는 시작 태그로 시작해서 종료 태그로 끝난다. <HTML> ... </HTML>
      • 시작 태그와 종료 태그 사이에는 값 Value 또는 다른 태그를 중첩해서 포함할 수 있다. ▪ <P>Hello</P><P><IMG SRC="camp.jpg">camp</IMG></P>
      • 값이 없어도 되는 특정한 태그들은 </br> 형태로 시작-종료 태그를 한꺼번에 표시한다.
      • 시작 태그 > 좌측 부분에는 해당 태그의 속성을 명시할 수 있다. <FONT name="Newyork">Big Apple</FONT>

[엘리먼트 명명 규칙]

  • 영문, 숫자, 하이픈, 언더스코어, 점만으로 구성
  • 대소문자 구분
  • 영문자나 언더스코어로만 시작
  • 공백 포함 불가능
  • xml, XML, Xml 등의 예약어 불가능

(* 중복된 이름은 네임스페이스를 통해 충돌을 방지한다: https://www.tcpschool.com/xml/xml_basic_namespace)

속성

  • 속성은 여러 개의 값을 가질 수 없다
  • 속성 자체는 여러 개일 수 있으나, 공백으로 분리한다.
  • 중복된 속성명을 사용할 수 없다
  • 값은 반드시 가지지만, 빈문자열도 가능하다.
  • XML 트리에 포함되지 않는다

엔티티

다섯 개의 특별한 기호는 XML 파서에서 완전히 다르게 인식한다. 엔티티는 이렇게 다르게 인식하는 것을 방지하고 있는 그대로의 의미를 유지하기 위한 문자셋이다.

엔티티 이름16진수 엔티티설명
<<<보다 작은
>>>보다 큰
&&&and 기호
""큰따옴표
''작은따옴표

(https://www.tcpschool.com/xml/xml_basic_syntax)

위의 5가지는 내장된 엔티티고, 이것 외에도 일반/문장/외부/파라미터 엔티티 등의 종류가 더 있다 OMG (참고: https://blog.naver.com/taekani/130015663753)

XML 파서 Parser

XML 파서란

응용 프로그램이 XML 문서를 읽을 수 있도록 인터페이스를 제공한다. 형태의 적합성과 문법상의 오류까지 확인한다.

동작 방식은 아래와 같다.

Untitled

XML 문서를 plain text 자체로 읽고 → XML DOM 객체로 반환한다. 미션에서 트리 형태로 저장하는 것과 유사하다.

DOM에 대해서

DOM은 이미 HTML문서를 다루면서도 익히 들어봤듯이, 문서의 요소와 각 요소에 대한 접근 방법까지 정의한다. 위의 XML DOM도 이에 해당.

This post is licensed under CC BY 4.0 by the author.