XML 질의 언어
IT위키
더 많은 작업
XML 질의 언어(XML Query Language)는 트리 구조로 된 XML 문서에서 원하는 요소·속성·값을 찾아내고, 걸러 내고, 새 XML 로 다시 구성하기 위해 쓰는 언어로, W3C 의 XPath·XQuery 와 SQL 의 XML 확장인 SQL/XML 이 대표적이다.
관계형 데이터는 행과 열로 된 평평한 표라서 SQL 로 질의한다. XML 은 요소가 요소를 품는 계층(트리) 구조이고, 같은 요소가 몇 번 나올지, 어떤 요소가 빠질지 정해지지 않은 반구조적(semi-structured) 데이터다. 그래서 "몇 번째 단계의 어떤 요소" 를 가리키는 경로 표현과 순서·중첩을 다루는 기능이 필요하다. 1990년대 후반 XML-QL, Lorel, XQL, Quilt 같은 연구 언어가 나왔고, W3C 가 이를 모아 XPath 와 XQuery 로 표준화했다.
| 언어 | 표준 | 하는 일 | 예 |
|---|---|---|---|
| XPath | W3C 권고(1.0 1999년, 3.1 2017년) | 경로 표현식으로 문서 트리에서 노드를 선택한다. 축(child, parent, descendant 등), 노드 테스트, 조건(술어 [ ]) 으로 이루어진다 | /library/book[price > 30]/title
|
| XQuery | W3C 권고(1.0 2007년, 3.1 2017년) | XPath 를 포함하며 FLWOR 식으로 검색·조인·정렬·재구성까지 하는 XML 의 SQL이다. 결과를 새 XML 로 만든다 | 아래 예 |
| XSLT | W3C 권고 | XML 을 다른 XML·HTML·텍스트로 변환하는 규칙(템플릿) 언어. 노드 선택에 XPath 를 쓴다 | 화면 출력용 HTML 생성 |
| SQL/XML | ISO/IEC 9075-14 (SQL:2003 부터) | 관계형 DBMS 안에서 XML 을 다루는 SQL 확장. XML 데이터 타입과 함수(XMLELEMENT, XMLAGG, XMLQUERY, XMLTABLE, XMLEXISTS)를 둔다 | 테이블 행을 XML 로 내보내기, XML 컬럼을 XQuery 로 질의 |
| 절 | 뜻 | SQL 에 견주면 |
|---|---|---|
| For | 노드 집합을 하나씩 돌며 변수에 묶는다 | FROM |
| Let | 값을 변수에 묶는다(반복하지 않음) | 별칭 |
| Where | 조건으로 거른다 | WHERE |
| Order by | 정렬한다 | ORDER BY |
| Return | 결과를 만든다. 새 요소를 구성할 수 있다 | SELECT |
for $b in doc("library.xml")/library/book
let $p := $b/price
where $p > 30
order by $b/title
return <expensive>{ $b/title }</expensive>
XML 을 관계형 데이터베이스에 넣거나 테이블을 XML 로 내보내려면 트리와 표 사이의 대응 규칙(매핑)이 필요하다.
| 매핑 방식 | 방법 | 장점 | 단점 |
|---|---|---|---|
| 구조(스키마) 기반 매핑 | XML 스키마나 DTD 를 보고 요소마다 테이블을 만든다. 반복되는 하위 요소는 별도 테이블로 떼고 외래 키로 부모와 잇는다. 단순 요소·속성은 컬럼이 된다 | 일반 SQL 로 질의·인덱스·무결성 제약을 그대로 쓴다 | 스키마가 바뀌면 테이블도 바꿔야 한다. 깊은 중첩은 조인이 많아진다 |
| 모델 기반 매핑(에지·노드 방식) | 스키마와 상관없이 노드 하나를 한 행으로 저장한다(노드 ID, 부모 ID, 이름, 값, 순서) | 어떤 XML 이든 저장한다 | 문서를 복원하거나 경로를 질의할 때 자기 조인이 반복되어 느리다 |
| 테이블 기반 매핑 | XML 을 "테이블 - 행 - 컬럼" 모양의 정해진 틀로만 다룬다. 데이터 교환용으로 DB 를 그대로 XML 로 덤프할 때 쓴다 | 단순하다 | 임의 구조의 문서를 담지 못한다 |
| 통째 저장 | 문서를 CLOB 이나 XML 타입 컬럼에 그대로 넣고 XQuery·SQL/XML 로 질의한다 | 원문과 순서·주석이 보존된다 | 부분 수정·질의 성능은 별도 XML 인덱스에 기댄다 |
- 구조 기반·모델 기반처럼 문서를 쪼개 테이블에 나눠 넣는 것을 분해 저장(shredding), 다시 XML 로 조립하는 것을 게시(publishing)라고 한다
- 요소의 순서, 혼합 콘텐츠(텍스트와 요소가 섞인 내용), 네임스페이스는 표로 옮기면 잃기 쉬워 따로 순서 컬럼 등을 둔다
- 저장 방식에 따른 DBMS 분류는 XML 데이터베이스 문서에 있다
| 구분 | SQL | XPath·XQuery |
|---|---|---|
| 데이터 모델 | 릴레이션(평평한 표), 행 순서 없음 | 트리, 문서 순서 있음 |
| 스키마 | 반드시 있다 | 없어도 된다(반구조적) |
| 기본 단위 | 행·열 | 노드(요소·속성·텍스트) |
| 결과 | 테이블 | 노드 열(sequence), 새 XML |
| 탐색 | 조인 | 경로 표현식(부모·자식·후손 축) |