XPath
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
XPath는 XML 문서의 특정 부분을 선택하기 위한 쿼리 언어이다. 1999년에 XPath 1.0이 처음 발표된 이후 여러 버전이 출시되었으며, 현재는 XPath 3.1이 최신 버전이다. XML 문서를 노드 트리로 보고, 로케이션 경로를 사용하여 노드 또는 노드 집합을 지정한다. XPath는 스키마 언어, 프로그래밍 언어, 데이터베이스 등 다양한 환경에서 활용되며, 텍스트, 숫자, 부울 등의 데이터 형식을 지원하고, 문자열, 숫자, 노드 정보 등을 처리하는 다양한 함수와 연산자를 제공한다.
더 읽어볼만한 페이지
- 질의 언어 - 임베디드 SQL
임베디드 SQL은 호스트 프로그래밍 언어 내에 SQL 문을 삽입하여 데이터베이스와 상호 작용하는 기술로, 데이터베이스 액세스를 표준화하지만 보안 취약점과 이식성 저하의 단점도 가진다. - 질의 언어 - XQuery
XQuery는 함수형 프로그래밍 패러다임을 지원하며 XPath 식 구문의 상위 집합을 포함하는 XML 데이터 추출 및 조작을 위한 쿼리 언어로서, FLWOR 식을 통해 XML 데이터 조작 및 새로운 XML 문서 구성을 지원하고 XQuery 및 XPath 데이터 모델(XDM)을 기반으로 한다. - XML - 오피스 오픈 XML
오피스 오픈 XML은 마이크로소프트에서 개발한 XML 기반의 파일 포맷으로, 문서, 스프레드시트, 프레젠테이션 등의 사무용 전자 문서를 표현하기 위해 사용되며 마이크로소프트 오피스 2007부터 기본 파일 형식으로 채택되어 ECMA 인터내셔널 및 ISO/IEC 국제 표준으로도 표준화되었다. - XML - 자원 기술 프레임워크
자원 기술 프레임워크(RDF)는 웹 상의 메타데이터를 표현하기 위한 표준 모델로, URI 기반의 리소스와 트리플 구조의 속성을 사용하여 정보 자원 간의 관계를 명확하게 기술하며, 시맨틱 웹 구축의 핵심 기술로서 다양한 분야에서 활용된다. - W3C 표준 - HTML
HTML은 웹 페이지 제작을 위한 표준 마크업 언어로서, 팀 버너스리가 제안하고 구현한 후 인터넷 발전과 함께 널리 사용되며, SGML에 기반하여 하이퍼텍스트 기능으로 다양한 콘텐츠를 표현하고 연결하며, W3C와 WHATWG에서 표준화를 진행하고 최신 버전은 HTML Living Standard이다. - W3C 표준 - 타임드 텍스트
타임드 텍스트는 영상이나 오디오 콘텐츠에 시간 정보를 담아 표현되는 텍스트로, 자막이나 캡션 등에 활용되며 TTML, WebVTT 등의 표준이 존재한다.
2. 역사
XPath 언어는 XML 문서의 트리 표현을 기반으로 하며, 다양한 기준에 따라 노드를 선택하여 트리를 탐색하는 기능을 제공한다.[2][3] XPath 표현식은 종종 "XPath"라고 불린다.
원래 XPointer와 XSLT 간의 공통 구문 및 동작 모델을 제공하려는 의도에서 출발하였으며, XML 스키마, XForms 및 국제화 태그 집합(ITS)과 같은 다른 W3C 사양에서 쿼리 언어의 하위 집합으로 사용된다.
XPath는 많은 XML 처리 라이브러리 및 도구에 채택되었으며, 이들 중 다수는 XPath의 더 간단한 대안으로 또 다른 W3C 표준인 CSS 선택자도 제공한다.
2. 1. 버전
XPath는 여러 버전이 존재하며, 각 버전은 기능 개선 및 확장을 포함한다. 현재 가장 널리 사용되는 버전은 XPath 1.0이지만, XPath 2.0, 3.0, 3.1도 사용되고 있다.- XPath 1.0은 1999년에 권고안이 되었으며, XSLT, XProc 등 여러 언어에 내장되거나 Java, C#, Python, 자바스크립트 등에서 API를 통해 호출되는 방식으로 널리 사용된다.[1]
- XPath 2.0은 2007년에 권고안이 되었으며(2010년에 두 번째 에디션 발표), XPath 1.0보다 훨씬 큰 언어 사양을 가지며 타입 시스템 등 기본적인 개념에도 변화가 있다.[1] XDM을 기반으로 더 풍부한 타입 시스템을 지원하며, 모든 값은 시퀀스로 처리된다.
- XPath 3.0은 2014년에 권고안이 되었으며, 함수를 일급 값으로 지원하는 기능이 추가되었다.[4][5]
- XPath 3.1은 2017년에 권고안이 되었으며, 맵과 배열 데이터 타입을 추가하여 JSON을 지원한다.[6]
2. 1. 1. XPath 1.0
XPath 1.0은 1999년 11월 16일에 월드 와이드 웹 컨소시엄 권고안이 되었으며, Java, C#, Python 또는 자바스크립트와 같은 언어의 API를 통해 호출되거나, XSLT, XProc, XML 스키마 또는 XForms와 같은 언어에 내장되어 널리 구현되고 사용된다.[1] XPath 1.0은 노드 집합, 문자열, 숫자, 부울의 네 가지 데이터 형식을 기반으로 한다.2. 1. 2. XPath 2.0
XPath 2.0은 2007년 1월 23일에 W3C 권고안으로 발표되었다. (2010년 12월 14일에 두 번째 에디션 발표)[1] XPath 2.0은 XPath 1.0보다 훨씬 더 풍부한 타입 시스템을 갖춘 XDM을 기반으로 하며, 모든 값은 시퀀스로 처리되고 단일 값은 길이가 1인 시퀀스로 간주된다.[1]XPath 2.0은 XML 스키마로 규정된 내장된 원자 데이터 형식과 스키마에서 정의된 사용자 정의 형식을 다룰 수 있다. XPath 1.0의 노드 집합은 XPath 2.0에서 어떤 순서를 가지는 시퀀스로 대체되었다. 다양한 형식을 다루기 위해 함수와 연산자가 대폭 확장되었다.
XPath 2.0은 XQuery 1.0의 하위 집합이며, 이들은 동일한 데이터 모델(XDM)을 공유한다. XPath 2.0은 XQuery의 "FLWOR" 표현식의 축소된 버전인 `for` 표현식을 제공한다.
2. 1. 3. XPath 3.0
XPath 3.0은 2014년 4월 8일에 W3C 권고안이 되었다.[4] 가장 중요한 새로운 기능은 함수를 일급 값으로 지원하는 것이다.[5] XPath 3.0은 XQuery 3.0의 하위 집합이며, 현재(2014년 4월) 구현의 대부분은 XQuery 3.0 엔진의 일부로 존재한다.2. 1. 4. XPath 3.1
XPath 3.1은 2017년 3월 21일에 월드 와이드 웹 컨소시엄(W3C) 권고안으로 발표되었다.[6] 이 버전은 맵과 배열 등 새로운 데이터 타입을 추가하여, 주로 JSON 데이터 처리를 지원한다.3. 데이터 모델
XPath는 XML 문서를 트리 구조로 표현하며, 이 트리 구조는 루트 노드를 최상위로 하는 여러 종류의 노드로 구성된다.[2][3] XPath에서 사용되는 노드의 종류는 다음과 같다.
- 루트 노드
- 요소 노드
- 텍스트 노드
- 속성 노드
- 네임스페이스 노드
- 처리 명령 노드
- 코멘트 노드
4. 로케이션 경로 (Location Path)
로케이션 경로는 XML 문서 내에서 특정 노드 또는 노드 집합을 선택하는 데 사용되는 XPath 표현식이다. 로케이션 경로는 하나 이상의 로케이션 스텝으로 구성되며, 각 스텝은 `/`로 구분된다.
XPath 식은 ''컨텍스트 노드''를 기준으로 평가된다. '자식' 또는 '후손'과 같은 축 지정자는 컨텍스트 노드에서 탐색할 방향을 지정한다. 노드 테스트와 술어는 축 지정자에 의해 지정된 노드를 필터링하는 데 사용된다. 예를 들어 노드 테스트 'A'는 탐색된 모든 노드가 'A' 레이블을 가져야 한다. 술어는 선택된 노드가 XPath 표현식 자체에 의해 지정된 특정 속성을 갖도록 지정하는 데 사용할 수 있다.
XPath 구문에는 ''약식 구문''과 ''전체 구문'' 두 가지 유형이 있다. 약식 구문은 더 간결하며 직관적이고 많은 경우 익숙한 문자와 구문을 사용하여 XPath를 쉽게 쓰고 읽을 수 있다. 전체 구문은 더 장황하지만 더 많은 옵션을 지정할 수 있으며 주의 깊게 읽으면 더 자세하게 설명할 수 있다.
다음 XPath 식은 모든 project 요소의 name 속성을 선택한다.
` /wikimedia/projects/project/@name `
다음 XPath 식은 모든 영문 Wikimedia 프로젝트의 주소(`language` 속성이 ''English''인 모든 `edition` 요소의 문자열)를 선택한다.
` /wikimedia/projects/project/editions/edition[@language="English"]/text() `
다음 XPath 식은 모든 위키백과의 주소(''Wikipedia''의 이름 특성을 가진 `project` 요소 아래에 존재하는 모든 `edition` 요소의 문자열)를 선택한다.
` /wikimedia/projects/project[@name="Wikipedia"]/editions/edition/text() `
4. 1. 로케이션 스텝 (Location Step)
로케이션 스텝은 XML 문서 내에서 특정 노드를 선택하기 위한 단계이다. 각 로케이션 스텝은 다음 세 가지 요소로 구성된다.- 축
- 노드 테스트
- 술어
로케이션 스텝은 다음 두 종류의 구문을 사용하여 기술할 수 있다.
; 생략 구문
: 간결하고 XPath의 식을 읽기 쉽고 쓰기 쉽게 기술할 수 있다. 직관적이며 많은 경우 친숙한 문자열과 구문으로 기술한다.
; 완전한 구문
: 생략 구문에 비해 기술이 장황하지만, 생략 구문보다 많은 옵션을 지정할 수 있으며, 또한 XPath 식을 주의 깊게 읽을 때는 생략 구문보다 설명적으로 기술되어 있어 XPath 식을 정확하게 이해하는 데 도움이 된다.
XPath 표현식은 ''컨텍스트 노드''를 기준으로 평가된다. '자식' 또는 '후손'과 같은 축 지정자는 컨텍스트 노드에서 탐색할 방향을 지정한다. 노드 테스트와 술어는 축 지정자에 의해 지정된 노드를 필터링하는 데 사용된다. 예를 들어 노드 테스트 'A'는 탐색된 모든 노드가 'A' 레이블을 가져야 한다. 술어는 선택된 노드가 XPath 표현식 자체에 의해 지정된 특정 속성을 갖도록 지정하는 데 사용할 수 있다.
XPath 구문에는 두 가지 유형이 있다. ''약식 구문''은 더 간결하며 직관적이고 많은 경우 익숙한 문자와 구문을 사용하여 XPath를 쉽게 쓰고 읽을 수 있다. ''전체 구문''은 더 장황하지만 더 많은 옵션을 지정할 수 있으며 주의 깊게 읽으면 더 자세하게 설명할 수 있다.
4. 2. 구문
XPath에는 로케이션 스텝을 기술하는 데 사용되는 두 가지 구문, 즉 생략 구문과 완전한 구문이 있다.[1]생략 구문은 더 간결하며, 일반적인 경우에 많은 기본값과 약어를 허용하여 XPath를 쉽게 쓰고 읽을 수 있도록 한다. 예를 들어, 다음과 같은 간단한 XML이 주어졌을 때:
가장 간단한 XPath 표현식은 `/A/B/C` 와 같은 형태를 취한다. 이 표현식은 XML 문서의 최상위 요소인 A 요소의 자식인 B 요소의 자식인 C 요소를 선택한다. XPath 구문은 URI(Uniform Resource Identifier) 및 유닉스 스타일 파일 경로 구문을 모방하여 설계되었다.[1]
더 복잡한 표현식도 가능하다. 예를 들어, `A//B/*[1]` 표현식은 현재 컨텍스트 노드의 자식이거나 더 깊은 하위 요소인 A 요소의 모든 B 요소 중 첫 번째 자식을 선택한다. 여기서 `[1]` 술어는 `/` 연산자보다 더 강력하게 바인딩된다. XPath 술어의 인덱스 값은 1부터 시작한다.[1]
완전한 구문은 더 장황하지만, 더 많은 옵션을 지정할 수 있으며, 주의 깊게 읽으면 더 자세하게 설명할 수 있다. 완전한 구문에서는 축, 노드 테스트, 술어가 명시적으로 모두 표현된다.[1]
예를 들어, 다음의 XPath 식을 보자.
- `/wikimedia/projects/project/@name`: 모든 project 요소의 name 속성을 선택한다.[1]
- `/wikimedia/projects/project/editions/edition[@language="English"]/text()`: 모든 영문 Wikimedia 프로젝트의 주소를 선택한다.[1]
- `/wikimedia/projects/project[@name="Wikipedia"]/editions/edition/text()`: 모든 위키백과의 주소를 선택한다.[1]
위의 예시들을 완전한 구문으로 표현하면 다음과 같다.[1]
- `child::A/child::B/child::C`
- `child::A/descendant-or-self::node()/child::B/child::node()[position()=1]`
여기에서 XPath의 각 단계에서 축(예: `child` 또는 `descendant-or-self`)이 명시적으로 지정되고, 그 뒤에 `::`가 오고, 노드 테스트(예: `A` 또는 `node()`)가 온다.[1]
4. 2. 1. 생략 구문
생략 구문은 자주 사용되는 표현 방식을 축약하여 나타낸다.예시:
- `'/A/B/C'`
- 이 예시는 절대 경로를 나타내며, 0개 이상의 `C` 요소를 선택한다. 선택된 `C` 요소는 `B` 요소의 자식 요소(child element영어)이며, 그 `B` 요소는 `A` 요소의 자식 요소이고, `A` 요소는 해당 XML 문서의 루트 요소이다. XPath 구문은 URI(Uniform Resource Identifier) 및 유닉스 스타일 파일 경로 구문과 유사하게 설계되었다.[1]
- `'A//B/*[1]'`
- 이 예시는 상대 경로를 나타내며, 임의의 이름(`*`)의 첫 번째 요소(`[1]`)를 선택한다. 선택된 "첫 번째 요소"는 `B` 요소의 자식 요소(`/`)이며, 그 `B` 요소는 `A` 요소의 직접적 또는 간접적인 자식 요소(자손 요소, `//`)이며, 그 `A` 요소는 현재의 컨텍스트 노드의 자식 요소이다.[1]
생략 구문에서는 완전한 구문에 비해 기술 능력은 제한되지만, 앞의 예시보다 복잡한 표현식도 기술할 수 있다. 생략 구문에서는 다음과 같은 축을 지정할 수 있다.[1]
- 기본 `'child'` 축
- `'attribute'` 축
- `'descendant-or-self'` 축
- `'self'` 축
- `'parent'` 축
또한, 간결한 노드 이름에 의한 지정 이외의 노드 테스트를 지정할 수 있으며, 어떤 로케이션 스텝에도 대괄호 `[]`를 붙여 술어를 지정할 수 있다.[1]
생략 구문의 전체 목록과 정식 정의는 #완전한 구문과 생략 구문의 대응 관계 절에서 확인할 수 있다.[1]
4. 2. 2. 완전한 구문
완전한 구문은 축, 노드 테스트, 술어를 명시적으로 모두 표현한다.아래의 XPath 식은
` /wikimedia/projects/project/@name `
모든 project 요소의 name 속성을 선택한다.
` /wikimedia/projects/project/editions/edition[@language="English"]/text() `
모든 영문 Wikimedia 프로젝트의 주소(`language` 속성이 ''English''인 모든 `edition` 요소의 문자열)를 선택한다.
` /wikimedia/projects/project[@name="Wikipedia"]/editions/edition/text() `
모든 위키백과의 주소(''Wikipedia''의 이름 특성을 가진 `project` 요소 아래에 존재하는 모든 `edition` 요소의 문자열)를 선택한다.[1]
전체 축약되지 않은 구문에서 위 두 예시는 다음과 같이 작성된다.[1]
- `child::A/child::B/child::C`
- `child::A/descendant-or-self::node()/child::B/child::node()[position()=1]`
여기에서 XPath의 각 단계에서 '''축'''(예: `child` 또는 `descendant-or-self`)이 명시적으로 지정되고, 그 뒤에 `::`가 오고, 예시에서 `A` 또는 `node()`와 같은 '''노드 테스트'''가 온다.[1]
더 짧게 표현하면 다음과 같다: `A//B/*[position()=1]`[1]
완전한 구문의 일반 형식은 다음과 같다.[1]
:`/축 방향::네임스페이스:노드 테스트[술어]/~~`
앞서 #생략 구문절에서 제시한 두 가지 예를 생략하지 않는 완전한 구문으로 다시 쓰면 다음과 같다.[1]
:`/child::A/child::B/child::C`
:`child::A/descendant-or-self::node()/child::B/child::*[1]`
이처럼 완전한 구문으로 기술된 로케이션 경로의 각 로케이션 스텝에서는,[1]
- 축을 `child`나 `descendant-or-self`와 같이 명시적으로 지정한다.
- 축 지정을 이어 `::`를 기술하고, 더 나아가 노드 테스트를 `A`나 `node()`, `*`와 같이 기술한다.
- 생략 구문과 마찬가지로 노드 테스트 지정에 이어 대괄호 `[`과 `]`를 붙여 술어를 지정할 수 있다.
4. 3. 축 (Axis)
축 지정자는 XML 문서의 트리 표현 내에서 탐색 방향을 나타낸다. 사용 가능한 축은 다음과 같다.[7]
약식 구문에서 '''attribute''' 축을 사용하는 예로, `//a/@href`는 문서 트리 내 어디에서나 `a` 요소에서 `href`라는 속성을 선택한다.
표현식 `.` ('''self::node()'''의 약자)는 현재 선택된 노드를 참조하기 위해 술어 내에서 가장 일반적으로 사용된다.
예를 들어, `h3[.='See also']`는 현재 컨텍스트에서 텍스트 내용이 `See also`인 `h3`라는 요소를 선택한다.
로케이션 스텝의 축은 XML 문서의 트리 구조에서 방향을 지정한다. XPath 사양에서 정의된 13가지 종류의 축(완전한 구문)을 나타낸다.
- `child`: 컨텍스트 노드의 자식 노드
- `descendant`: 컨텍스트 노드의 자손 노드
- `parent`: 컨텍스트 노드의 부모 노드
- `ancestor`: 컨텍스트 노드의 조상 노드
- `following-sibling`: 컨텍스트 노드의 형제 노드 중 뒤에 있는 노드
- `preceding-sibling`: 컨텍스트 노드의 형제 노드 중 앞에 있는 노드
- `following`: XML 문서의 문서 순서에서 컨텍스트 노드보다 뒤에 있는 모든 노드
- `preceding`: XML 문서의 문서 순서에서 컨텍스트 노드보다 앞에 있는 모든 노드
- `attribute`: 컨텍스트 노드가 요소인 경우, 해당 속성 노드
- `namespace`: 컨텍스트 노드가 요소인 경우, 해당 네임스페이스 노드
- `self`: 컨텍스트 노드 자신
- `descendant-or-self`: 컨텍스트 노드 자신과 컨텍스트 노드의 자손 노드
- `ancestor-or-self`: 컨텍스트 노드 자신과 컨텍스트 노드의 조상 노드
생략 구문에서 `attribute` 축을 사용하는 예를 나타낸다.
: `//a/@href`
이 예에서는 `href` 속성 노드의 집합을 선택한다.
선택된 `href` 속성 노드는 XML 문서 내의 어느 `a` 요소 노드에 속해 있다.
`self` 축은 후술할 술어 안에서 해당 술어 바로 앞의 노드 테스트에서 선택된 노드를 기술하기 위해 자주 사용된다.
예를 나타낸다.
: `h3[.='관련 항목']`
이 예에서는 현재 노드의 자식 노드이며, 내용의 텍스트 `'관련 항목'`을 갖는 `h3` 요소가 선택된다.
4. 4. 노드 테스트 (Node Test)
노드 테스트는 축을 통해 탐색된 노드 중에서 특정 조건을 만족하는 노드를 선택한다. 노드 테스트는 특정 노드 이름 또는 더 일반적인 표현식으로 구성될 수 있다.[16]노드 테스트 형식은 다음과 같다.[16]
예를 들어, 네임스페이스 접두사 `gs`가 정의된 XML 문서에서 `//gs:enquiry`와 같이 노드 테스트가 기술된 경우, `gs` 네임스페이스 아래의 `enquiry`를 노드 이름으로 하는 모든 노드의 집합이 이 노드 테스트의 지정 대상이 된다.[16]
다른 노드 테스트 형식은 다음과 같다.
- `comment()`: XML 주석 노드를 찾는다. (예: ``)
- `text()`: 자식을 제외한 텍스트 유형의 노드를 찾는다. (예: `<k>hello<m> world</m></k>`에서 `hello`)
- `processing-instruction()`: ``와 같은 XML 처리 지시자를 찾는다. 이 경우 `processing-instruction('php')`가 일치한다.
- `node()`: 모든 노드를 찾는다.
4. 5. 술어 (Predicate)
술어(Predicate)는 대괄호(`[]`) 안에 표현식으로 작성되며, 노드 집합을 특정 조건에 따라 필터링하는 데 사용된다.[1] 예를 들어, `a[@href='help.php']`는 `href` 속성 값이 `help.php`인 `a` 요소만 선택한다.[1]하나의 로케이션 스텝에 여러 개의 술어를 지정할 수 있으며, 순서가 중요하다.[1] 술어 내에서 연산자, 함수, 다른 XPath 표현식 등을 사용하여 복잡한 조건을 표현할 수 있다.[1] 술어는 로케이션 스텝의 컨텍스트를 변경하지 않는다.[1] 즉, 술어는 바로 앞의 노드 테스트로 지정된 노드 집합을 변경하지 않고 필터링만 수행한다.[1]
예시는 다음과 같다.[1]
- `//a[@href='help.php']`: `href` 속성 값이 `'help.php'`인 모든 `a` 요소를 선택한다.
- `//a[@href='help.php'][name(..)='div'][../@class='header']/@target`: `href` 속성 값이 `'help.php'`이고, 부모 요소의 이름이 `div`이며, 부모 요소의 `class` 속성 값이 `'header'`인 `a` 요소의 `target` 속성을 선택한다.
조건자 값이 숫자일 때는, 해당 위치에 있는 노드를 선택하는 것을 의미한다.[1] 예를 들어, `p[1]`은 첫 번째 `p` 요소를, `p[last()]`는 마지막 `p` 요소를 선택한다.[1] 조건자가 노드 집합으로 평가될 때는, 노드 집합이 비어 있지 않으면 참(true)으로 간주된다.[1] 예를 들어, `p[@x]`는 `x`라는 속성을 가진 `p` 요소를 선택한다.[1]
5. 데이터 형식, 연산자, 함수
XPath 1.0은 다음 네 가지 데이터 형식을 정의한다.[1]
- 노드 집합 (node-set; 순서가 정해지지 않은 노드의 집합)
- 문자열 (string)
- 숫자 (number; 부동소수점수)
- 논리형 (boolean)
XPath는 데이터 조작 및 계산을 지원하기 위해 다양한 연산자와 함수를 제공한다.
5. 1. 연산자
XPath 1.0은 노드 집합, 문자열, 숫자, 부울의 네 가지 데이터 형식을 정의한다.사용 가능한 연산자는 다음과 같다.
- 경로 표현식에서 사용되는 `/`, `//` 및 `[...]` 연산자.
- `|` 연산자: 두 노드 집합의 합집합을 만든다.
- 부울 연산자 `and`와 `or`, 그리고 함수 `not()`.
- 산술 연산자 `+`, `-`, `*`, `div` (나누기), `mod`.
- 비교 연산자 `=`, `!=`, `<`, `>`, `<=`, `>=`.
함수 라이브러리에는 다음이 포함된다.
- 문자열 조작 함수: `concat()`, `substring()`, `contains()`, `substring-before()`, `substring-after()`, `translate()`, `normalize-space()`, `string-length()`.
- 숫자 조작 함수: `sum()`, `round()`, `floor()`, `ceiling()`.
- 노드 속성 획득 함수: `name()`, `local-name()`, `namespace-uri()`.
- 처리 컨텍스트 정보 획득 함수: `position()`, `last()`.
- 형식 변환 함수: `string()`, `number()`, `boolean()`.
연산자를 사용하여 술어 내에서 표현식을 생성할 수 있다: `=`, `!=`, `<=`, `<`, `>=`, `>`. 부울 표현식은 괄호 `()` 및 부울 연산자 `and` 및 `or` 뿐만 아니라 위에 설명된 `not()` 함수와 결합될 수 있다. 숫자 계산은 `*`, `+`, `-`, `div` 및 `mod`를 사용할 수 있다. 문자열은 모든 유니코드 문자로 구성될 수 있다.
`//item[@price > 2*@discount]`는 가격 속성이 할인 속성의 숫자 값의 두 배보다 큰 항목을 선택한다.
전체 노드 집합은 수직 막대 문자 `|`를 사용하여 결합될 수 있다. 여러 조건 중 하나 이상을 충족하는 노드 집합은 '`or`'와 함께 술어 내에서 조건을 결합하여 찾을 수 있다.
`v[x or y] | w[z]`는 현재 컨텍스트에서 발견된 `x` 또는 `y` 자식 요소가 있는 모든 `v` 요소와 `z` 자식 요소가 있는 모든 `w` 요소로 구성된 단일 노드 집합을 반환한다.
5. 2. 함수
XPath는 문자열 처리, 숫자 계산, 노드 정보 획득, 데이터 형식 변환 등 다양한 기능을 수행하는 함수를 제공한다. XPath 1.0은 노드 집합(내부 순서가 없는 노드의 집합), 문자열, 숫자, 부울의 네 가지 데이터 형식을 정의한다.사용 가능한 연산자는 다음과 같다.
- 경로 표현식에서 사용되는 `/`, `//` 및 `[...]` 연산자.
- 두 노드 집합의 합집합을 형성하는 `|` 연산자.
- 부울 연산자 `and`와 `or`, 그리고 함수 `not()`.
- 산술 연산자 `+`, `-`, `*`, `div` (나누기), `mod`.
- 비교 연산자 `==`, `!=`, `<`, `>`, `<=`, `>=`.
함수 라이브러리에는 다음이 포함된다.
- 문자열 조작 함수: `concat()`, `substring()`, `contains()`, `substring-before()`, `substring-after()`, `translate()`, `normalize-space()`, `string-length()`.
- 숫자 조작 함수: `sum()`, `round()`, `floor()`, `ceiling()`.
- 노드 속성 획득 함수: `name()`, `local-name()`, `namespace-uri()`.
- 처리 컨텍스트 정보 획득 함수: `position()`, `last()`.
- 형식 변환 함수: `string()`, `number()`, `boolean()`.
연산자를 사용하여 술어 내에서 표현식을 생성할 수 있다: `=`, `!=`, `<=`, `<`, `>=`, `>`. 부울 표현식은 괄호 `()`와 부울 연산자 `and` 및 `or` 뿐만 아니라 위에 설명된 `not()` 함수와 결합할 수 있다. 숫자 계산은 `*`, `+`, `-`, `div` 및 `mod`를 사용할 수 있다. 문자열은 모든 유니코드 문자로 구성될 수 있다.
예시:
- `//item[@price > 2*@discount]`: 가격 속성이 할인 속성의 숫자 값의 두 배보다 큰 항목을 선택한다.[1]
- `v[x or y] | w[z]`: 현재 컨텍스트에서 발견된 `x` 또는 `y` 자식 요소가 있는 모든 `v` 요소와 `z` 자식 요소가 있는 모든 `w` 요소로 구성된 단일 노드 집합을 반환한다.[1]
자주 사용되는 함수는 다음과 같다.
- `position()`: 평가 중인 컨텍스트 노드의 위치를 숫자로 반환한다 (형제 노드에서의 위치).
- `count(node-set)`: 인수의 노드 집합 (또는 노드 집합을 반환하는 식)의 노드 수를 반환.
- `id(object)`: 인수의 객체의 문자열 값을 ID형 속성 값으로 갖는 노드 집합을 반환.
- `name(node-set?)`: 인수로 전달된 노드 집합의 첫 번째 노드의 이름을 반환한다 (노드가 요소인 경우 요소명, 속성인 경우 속성명).
5. 2. 1. 문자열 함수
XPath 1.0은 노드 집합(내부 순서가 없는 노드의 집합), 문자열, 숫자, 부울의 네 가지 데이터 형식을 정의한다.함수 라이브러리에는 문자열을 조작하는 함수 등이 포함된다. 가장 일반적으로 사용되는 몇 가지 함수는 아래에 자세히 설명되어 있다.
- `string(''객체?'')`: 네 가지 XPath 데이터 유형 중 임의의 유형을 내장 규칙에 따라 문자열로 변환한다. 인수의 값이 노드 집합인 경우, 함수는 문서 순서상 첫 번째 노드의 문자열 값을 반환하며, 다른 노드는 무시한다.
- `concat(''string'', ''string'', ''string''*)`: 둘 이상의 문자열을 연결한다.
- `starts-with(''s1'', ''s2'')`: `s1`이 `s2`로 시작하면 `true`를 반환한다.
- `contains(''s1'', ''s2'')`: `s1`에 `s2`가 포함되어 있으면 `true`를 반환한다.
- `substring(''string'', ''start'', ''length''?)`: 예: `substring("ABCDEF",2,3)`는 `BCD`를 반환한다.
- `substring-before(''s1'', ''s2'')`: 예: `substring-before("1999/04/01","/")`는 `1999`를 반환한다.
- `substring-after(''s1'', ''s2'')`: 예: `substring-after("1999/04/01","/")`는 `04/01`을 반환한다.
- `string-length(string?)`: 문자열의 문자 수를 반환한다.
- `normalize-space(''string''?)`: 모든 선행 및 후행 공백이 제거되고, 공백 문자 시퀀스는 단일 공백으로 대체된다. 이는 원본 XML이 prettyprint 형식으로 지정되어 추가적인 문자열 처리가 신뢰할 수 없게 될 수 있는 경우에 매우 유용하다.
; ''문자열''
string(''객체?''): XPath에서 규정된 4가지 종류의 데이터 형식을 인수로 받으며, 사양에 정의된 변환 규칙에 따라 문자열로 변환한다. 인수로 XPath 식을 전달할 수도 있다.
; ''숫자''
string-length(''문자열?''): 인수로 전달된 문자열의 길이 (문자 수)를 반환한다.
; ''문자열''
substring(''문자열'', ''숫자'', ''숫자?''): 인수로 전달된 문자열의 부분 문자열을 반환한다.
; ''문자열''
concat(''문자열'', ''문자열'', ''문자열*''): 인수로 전달된 여러 문자열을 연결하여 반환한다.
; ''부울''
contains(''문자열1'', ''문자열2''): 인수의 문자열 `''문자열1''`에 문자열 `''문자열2''`가 포함된 경우 `true` 함수가 반환하는 것과 동일한 값을 반환한다. 포함되지 않은 경우 `false` 함수가 반환하는 것과 동일한 값을 반환한다.
; ''문자열''
normalize-space(''문자열?''): 인수의 문자열을 정규화하여 반환한다. 즉, 문자열의 앞뒤 공백 문자를 제거하고, 제거 후 문자열 내에 연속해서 나타나는 공백 문자를 하나의 공백으로 대체한 문자열을 반환한다.
5. 2. 2. 숫자 함수
XPath 1.0은 숫자 조작을 위한 함수들을 제공한다. 주요 숫자 함수들은 다음과 같다.
이 함수들은 XPath 식 내에서 숫자 값을 계산하고 조작하는 데 사용될 수 있다. 예를 들어, `sum()` 함수는 특정 노드들의 값을 모두 더할 때 유용하며, `round()`, `floor()`, `ceiling()` 함수는 숫자 값을 정수로 변환할 때 사용된다.[1]
5. 2. 3. 노드 정보 함수
5. 2. 4. 데이터 형식 변환 함수
비교적 자주 사용되는 함수에 대해서는 다음 절에서 자세히 설명한다. 완전한 정의는 [http://www.w3.org/TR/xpath W3C의 권고] 및 [http://www.infoteria.com/jp/contents/xml-data/REC-xpath-19991116-jpn.htm (일본어 번역)]를 참조한다.
XPath 식은 괄호 `(`와 `)`로 묶어 그룹화하여 평가 순서를 명시할 수 있다.
술어에는 연산자를 사용한 식을 포함할 수 있다. 논리식(논리값을 반환하는 식)은 `and` 연산자나 `or` 연산자로 연결하거나, `not` 함수의 인수로 사용할 수 있다. 문자열(string)에는 유니코드 문자를 포함할 수 있다.
술어에서 연산자를 사용하는 예는 다음과 같다.
- `//item[@price >= 2*@discount]`
이 예에서는 `price` 속성의 수치가 `discount` 속성의 수치의 2배 이상인 `item` 요소의 집합을 선택한다.
연산자 `|`는 술어 내부 또는 외부에서 노드 집합의 합집합을 구하는 데 사용된다. 술어 외부에서 `|` 연산자를 사용하는 예는 다음과 같다.
- `v[x or y] | w[z]`
이 예는 하나의 노드 집합을 반환한다. 반환되는 노드 집합은 처리 중인 컨텍스트에서 자식 요소로 `x` 요소 또는 `y` 요소를 갖는 `v` 요소의 집합과 자식 요소로 `z` 요소를 갖는 `w` 요소 집합의 합집합이다.[1]
6. 구현
XPath는 다양한 프로그래밍 언어와 도구에서 구현되어 사용되고 있다.
C/C++, 자바, 자바스크립트, .NET 프레임워크, Perl, PHP, 파이썬, 루비 등 다양한 프로그래밍 언어에서 XPath를 사용할 수 있다. 예를 들어, 자바에서는 자바 API for XML 처리를 통해 자바 5부터 XPath 1.0이 구현되어 있으며, `javax.xml.xpath` 패키지를 사용하여 XPath를 평가할 수 있다.[8] MySQL이나 PostgreSQL과 같은 데이터베이스 관리 시스템에서도 XPath를 지원한다.
6. 1. 주요 구현체
6. 2. 커맨드 라인 도구
- XMLStarlet
- xmllint(libxml2)
7. 활용
XPath는 XML 스키마 언어에서 제약 조건을 표현하는 데 사용될 뿐만 아니라, 다양한 환경에서 활용된다.
- Schematron(ISO 표준 스키마 언어)은 XPath를 활용하여 제약 조건을 표현한다.
- W3C XML Schema 1.0에서는 XPath의 스트리밍 하위 집합을 사용하여 고유성 및 키 제약 조건을 표현한다. XSD 1.1에서는 XPath를 확장하여 속성 값 기반 조건부 유형 할당을 지원하고 요소 내용에 대한 부울 어설션을 평가할 수 있게 하였다.
- XForms는 XPath를 사용하여 유형을 값에 바인딩한다.
- PMD와 같은 비 XML 응용 프로그램에서도 사용된다. Java 소스 코드는 DOM과 유사한 파스 트리로 변환되며, 이 트리 위에서 XPath 규칙이 정의된다.
7. 1. 스키마 언어에서의 활용
XPath는 XML용 스키마 언어에서 제약 조건을 표현하는 데 점점 더 많이 사용되고 있다.- (현재 ISO 표준인) 스키마 언어 Schematron은 이 방식을 개척했다.
- XPath의 스트리밍 하위 집합은 고유성 및 키 제약 조건을 표현하기 위해 W3C XML Schema 1.0에서 사용된다. XSD 1.1에서는 XPath의 사용이 속성 값을 기반으로 하는 조건부 유형 할당을 지원하고 요소의 내용에 대해 임의의 부울 어설션을 평가할 수 있도록 확장되었다.
- XForms는 XPath를 사용하여 유형을 값에 바인딩한다.
- 이 방식은 PMD라는 Java용 소스 코드 분석기와 같은 비 XML 응용 프로그램에서도 사용된다. Java는 DOM과 유사한 파스 트리로 변환된 다음 트리 위에 XPath 규칙이 정의된다.
7. 2. 기타 활용
- (현재 ISO 표준인) 스키마 언어 Schematron은 이 방식을 개척했다.
- XPath의 스트리밍 하위 집합은 고유성 및 키 제약 조건을 표현하기 위해 W3C XML Schema 1.0에서 사용된다. XSD 1.1에서는 XPath의 사용이 속성 값을 기반으로 하는 조건부 유형 할당을 지원하고 요소의 내용에 대해 임의의 부울 어설션을 평가할 수 있도록 확장되었다.
- XForms는 XPath를 사용하여 유형을 값에 바인딩한다.
- 이 방식은 PMD라는 Java용 소스 코드 분석기와 같은 비 XML 응용 프로그램에서도 사용된다. Java는 DOM과 유사한 파스 트리로 변환된 다음 트리 위에 XPath 규칙이 정의된다.
8. 예제
다음은 XML 문서 예시다.
```xml
```
XPath 표현식 예시는 다음과 같다.
- `/wikimedia/projects/project/@name`: 모든 `project` 요소의 `name` 속성을 선택한다.
- `/wikimedia/projects/project/editions/edition[@language="English"]/text()`: `language` 속성이 "English"인 모든 `edition` 요소의 문자열을 선택하여, 모든 영문 Wikimedia 프로젝트의 주소를 나타낸다.
- `/wikimedia/projects/project[@name="Wikipedia"]/editions/edition/text()`: `name` 속성이 "Wikipedia"인 `project` 요소 아래에 존재하는 모든 `edition` 요소의 문자열을 선택하여, 모든 위키백과의 주소를 나타낸다.
참조
[1]
웹사이트
XML and Semantic Web W3C Standards Timeline
http://www.dblab.ntu[...]
2012-02-04
[2]
간행물
XPath—Retrieving Nodes from an XML Document
https://web.archive.[...]
2011-02-24
[3]
웹사이트
Course: The XPath Language
http://wam.inrialpes[...]
2012
[4]
웹사이트
XML Path Language (XPath) 3.0
https://www.w3.org/T[...]
2021-07-16
[5]
웹사이트
What's new in 3.0 (XSLT/XPath/XQuery) (plus XML Schema 1.1)
https://archive.xmlp[...]
2021-07-16
[6]
웹사이트
XML Path Language (XPath) 3.1
https://www.w3.org/T[...]
2021-07-16
[7]
웹사이트
Axis Specifiers
https://nwalsh.com/d[...]
Personal blog of venerated XML sage graybeard.
2021-02-25
[8]
웹사이트
javax.xml.xpath (Java SE 10 & JDK 10)
https://docs.oracle.[...]
2021-07-17
[9]
웹사이트
System.Xml Namespace
https://docs.microso[...]
2021-07-16
[10]
웹사이트
How To Crawl A Web Page with Scrapy and Python 3
https://www.digitalo[...]
2017-11-24
[11]
웹사이트
MySQL :: MySQL 5.1 Reference Manual :: 12.11 XML Functions
http://dev.mysql.com[...]
2021-07-17
[12]
웹사이트
xml2
https://www.postgres[...]
2021-07-16
[13]
학술지
tDOM – A fast XML/DOM/XPath package for Tcl written in C
http://www.tdom.org/[...]
2021-07-16
[14]
웹사이트
XPath 1.0 仕様 (英語)
http://www.w3.org/TR[...]
[15]
문서
W3C の XPath 1.0 作業部会では、ジェームズ・クラークとスティーヴン・ディローズが共同でエディタを務めた。また XSLT 1.0 作業部会では、ジェームズ・クラークがエディタを務めた。
[16]
서적
(株)日本ユニテックほか、2001年、p.66
[17]
서적
(株)日本ユニテックほか、2001年、p.67
[18]
웹사이트
javax.xml.xpath (Java Platform SE 6)
http://download.orac[...]
[19]
웹사이트
selectNodes Method
http://msdn.microsof[...]
[20]
웹사이트
evaluate - Document Object Model XPath
https://www.w3.org/T[...]
[21]
웹사이트
JavaScript-XPath
http://coderepos.org[...]
[22]
웹사이트
Google AJAXSLT
http://goog-ajaxslt.[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com