XPath
XPath![]() |
패러다임 | 쿼리 언어 |
---|---|
개발자 | W3C |
처음 등장한 | 1998 |
안정된 릴리스 | 3.1 / 2017년 3월 , 전( |
영향을 받다 | |
XSLT, XPointer | |
영향받은 | |
XML 스키마, XForms |
XPath(XML 경로 언어)는 XML 문서의 쿼리 또는 변환을 지원하도록 설계된 표현식 언어입니다.W3C([1]World Wide Web Consortium)에 의해 정의되었으며 XML 문서의 내용에서 값(예: 문자열, 숫자 또는 부울 값)을 계산하는 데 사용할 수 있습니다.XPath는 웹 브라우저와 같은 XML을 지원하는 응용 프로그램과 많은 프로그래밍 언어로 지원됩니다.
개요
XPath 언어는 XML 문서의 트리 표현을 기반으로 하며 트리를 [2][3]탐색하고 다양한 기준으로 노드를 선택할 수 있습니다.일반적으로 사용되는 (공식 사양에는 없지만) XPath 표현식은 단순히 "XPath"라고 불립니다.
원래 XPointer와 XSLT 간에 공통 구문 및 동작 모델을 제공하고자 하는 의도로 XPath 쿼리 언어의 서브셋은 XML Schema, XForms, Internationalization Tag Set(ITS) 등의 다른 W3C 사양에서 사용됩니다.
XPath는 다수의 XML 처리 라이브러리와 툴에 채택되어 있으며, 그 중 많은 툴은 XPath를 대체하는 또 다른 W3C 표준인 CSS Selector를 제공합니다.
버전
사용 중인 XPath 버전이 여러 개 있습니다.XPath 1.0은 1999년, XPath 2.0은 2007년(2010년 제2판), XPath 3.0은 2014년, XPath 3.1은 2017년에 발행되었습니다.그러나 XPath 1.0은 여전히 가장 널리 사용 [1]가능한 버전입니다.
- XPath 1.0은 1999년 11월 16일에 권장 사항이 되었으며 Java, C#, Python 또는 JavaScript와 같은 언어에서 API를 통해 호출되거나 XSLT, XProc, XML Schema 또는 XForms와 같은 언어에 내장되어 널리 구현 및 사용됩니다.
- XPath 2.0은 2007년 1월 23일에 권장 사항이 되었고, 2010년 12월 14일에 제2판이 발행되었습니다.많은 구현이 존재하지만 XPath 1.0만큼 널리 사용되지 않습니다.XPath 2.0 언어 사양은 XPath 1.0보다 훨씬 크고 유형 시스템 등 언어의 기본 개념 중 일부를 변경합니다.
- 가장 눈에 띄는 변화는 XPath 2.0이 [a]XQuery 및 XPath Data Model(XDM; 데이터 모델)을 기반으로 구축되어 있다는 것입니다.이제 모든 값이 시퀀스가 됩니다(단일 원자값 또는 노드는 길이1의 시퀀스로 간주됩니다).XPath 1.0 노드세트는 임의의 순서로 노드시퀀스로 대체됩니다.
- 보다 풍부한 타입 세트를 지원하기 위해 XPath 2.0은 기능 및 연산자 세트를 대폭 확장했습니다.
- XPath 2.0은 사실상 XQuery 1.0의 서브셋입니다.이들은 동일한 데이터 모델(XDM)을 공유합니다.이 제품은
for
XQuery에 있는 "FLWOR" 식의 축소 버전인 식입니다.생략된 XQuery의 일부를 나열함으로써 언어를 기술할 수 있습니다.주요 예로는 쿼리 프롤로그, 엘리먼트 및 속성 컨스트럭터, 나머지 "FLWOR" 구문 및typeswitch
표현.
- XPath 3.0은 2014년 [4]4월 8일에 권장 사항이 되었습니다.가장 중요한 신기능은 함수를 퍼스트 클래스 [5]값으로 지원하는 것입니다.XPath 3.0은 XQuery 3.0의 서브셋이며 현재 구현(2014년 4월)의 대부분은 XQuery 3.0 엔진의 일부로 존재합니다.
- XPath 3.1은 2017년 [6]3월 21일에 권장 사항이 되었습니다.이 버전에서는 맵과 어레이라는 새로운 데이터 유형이 추가되어 주로 JSON 지원을 지원합니다.
구문 및 의미론(XPath 1.0)
XPath에서 가장 중요한 식의 종류는 로케이션 경로입니다.로케이션 패스는 일련의 로케이션스텝으로 구성됩니다.각 로케이션 스텝에는 3개의 컴포넌트가 있습니다.
XPath 표현은 컨텍스트 노드에 대해 평가된다.'child' 또는 'descendant'와 같은 축 지정자는 컨텍스트 노드에서 탐색할 방향을 지정합니다.노드 테스트와 술어는 축 지정자에 의해 지정된 노드를 필터링하기 위해 사용됩니다.예를 들어 노드 테스트 'A'에서는 탐색하는 모든 노드에 'A'라는 레이블이 있어야 합니다.술어를 사용하여 선택한 노드가 XPath 식 자체에 의해 지정된 특정 속성을 가지도록 지정할 수 있습니다.
XPath 구문에는 두 가지 맛이 있습니다.간단한 구문은 보다 콤팩트하고 직관적인 방법으로 XPath를 쉽게 쓰고 읽을 수 있으며 많은 경우 익숙한 문자와 구조를 사용할 수 있습니다.전체 구문은 보다 상세하지만 더 많은 옵션을 지정할 수 있습니다. 주의 깊게 읽으면 더 자세히 설명합니다.
약어 구문
콤팩트 표기법에서는 일반적인 경우 많은 기본값과 약어를 사용할 수 있습니다.적어도 다음을 포함하는 지정된 소스 XML
<A> <B> <C/> </B> </A>
가장 단순한 XPath는 다음과 같은 형태를 취합니다.
/A/B/C
XML 문서의 가장 바깥쪽 요소를 구성하는 A 요소의 하위 요소인 B 요소의 하위 요소인 C 요소를 선택합니다.XPath 구문은 URI(Uniform Resource Identifier) 및 Unix 스타일의 파일 경로 구문을 모방하도록 설계되었습니다.
기본 '자' 축 이외의 축, 단순 이름 이외의 노드 테스트 또는 모든 단계 후에 대괄호로 쓸 수 있는 술어를 지정함으로써 보다 복잡한 식을 구성할 수 있습니다.예를 들어 다음과 같은 식입니다.
A//B/*[1]
첫 번째 아이를 선택합니다(').*[1]
이름이 무엇이든 간에, 그 자체가 자식 또는 다른 더 깊은 후손인 모든 B 요소(')//
A 요소의 ') 현재 컨텍스트노드의 자식입니다(식은 '로 시작하지 않습니다)./
'). 술어는[1]
보다 단단하게 결합하다/
교환입니다.식에서 선택한 첫 번째 노드를 선택하려면A//B/*
, 쓰기(A//B/*)[1]
또한 XPath 술어(기술적으로는 XPath 노드 세트의 '근접 위치')의 인덱스 값은 C나 Java와 같은 언어에서는 0이 아니라 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()
를 참조해 주세요.
여기서도 동일하지만 더 짧습니다.A//B/*[position()=1]
축 지정자
축 지정자는 XML 문서의 트리 표현 내에서 탐색 방향을 나타냅니다.사용 가능한 축은 다음과 같습니다.[b]
완전한 구문 | 약어 구문 | 메모들 |
---|---|---|
ancestor | ||
ancestor-or-self | ||
attribute | @ | @abc 의 줄임말이다attribute::abc |
child | xyz 의 줄임말이다child::xyz | |
descendant | ||
descendant-or-self | // | // 의 줄임말이다/descendant-or-self::node()/ |
following | ||
following-sibling | ||
namespace | ||
parent | .. | .. 의 줄임말이다parent::node() |
preceding | ||
preceding-sibling | ||
self | . | . 의 줄임말이다self::node() |
Atribute 축을 생략 구문에서 사용하는 예로서//a/@href
라고 하는 Atribute를 선택합니다.href
에a
구성 요소를 선택합니다.표현식 .(self:node()의 줄임말)은 현재 선택된 노드를 나타내기 위해 술어 내에서 가장 일반적으로 사용됩니다.예를들면,h3[.='See also']
라고 하는 요소를 선택합니다.h3
현재 컨텍스트에서 텍스트 내용은See also
.
노드 테스트
노드 테스트는 특정 노드 이름 또는 보다 일반적인 표현으로 구성됩니다.네임스페이스 접두사가 있는 XML 문서의 경우gs
정의되어 있습니다.//gs:enquiry
모든 것을 찾을 것이다.enquiry
네임스페이스의 요소 및//gs:*
는 로컬 이름에 관계없이 해당 네임스페이스에서 모든 요소를 찾습니다.
기타 노드 테스트 형식은 다음과 같습니다.
- 코멘트()
- 는 XML 코멘트노드를 찾습니다.
<!-- Comment -->
- 텍스트()
- 는 하위 항목을 제외한 유형 텍스트의 노드를 찾습니다(예:
hello
에<k>hello<m> world</m></k>
- 처리 명령()
- 는, 다음과 같은 XML 처리 순서를 검색합니다.
<?php echo $a; ?>
이 경우,processing-instruction('php')
일치합니다. - 노드()
- 임의의 노드를 검색합니다.
술어
각 괄호로 둘러싸인 표현식으로 기술된 술어는 특정 조건에 따라 노드 세트를 필터링하기 위해 사용할 수 있습니다.예를들면,a
node-set을 반환한다(모든 노드 세트)a
콘텍스트 노드의 자식 요소) 및a[@href='help.php']
그 요소들만 가지고 있는href
값을 가진 속성help.php
.
한 단계의 술어 수에는 제한이 없으며 XPath의 마지막 단계로 한정할 필요는 없습니다.또한 임의의 깊이까지 중첩할 수 있습니다.술어로 지정된 경로는 현재 단계의 컨텍스트(즉 직전 노드 테스트의 컨텍스트)에서 시작되며 해당 컨텍스트는 변경되지 않습니다.일치시키려면 모든 술어가 충족되어야 합니다.
술어 값이 숫자일 경우 노드 집합에서 노드 위치와 비교하기 위한 구문 설탕입니다(함수에 의해 지정됨).position()
)그래서p[1]
의 줄임말이다p[position()=1]
첫 번째를 선택합니다.p
Element Child, 동안p[last()]
의 줄임말이다p[position()=last()]
마지막을 선택합니다.p
콘텍스트노드의 아이입니다.
다른 경우 술어 값은 자동으로 부울로 변환됩니다.술어가 노드 세트를 평가할 때 노드 세트가 비어[clarify] 있지 않으면 결과가 참입니다.따라서p[@x]
그것들을 선택한다.p
라는 속성을 가진 요소x
.
좀 더 복잡한 예로는 표현식이 있습니다.a[/html/@lang='en'][@href='help.php'][1]/@target
의 값을 선택합니다.target
제1의 속성a
콘텍스트노드의 자녀들 사이에 있는 요소href
속성 설정help.php
이 문서의html
최상위 요소에는lang
속성 설정en
첫 번째 술어의 최상위 요소의 속성에 대한 참조는 다른 술어의 컨텍스트나 로케이션 단계 자체의 컨텍스트에는 영향을 주지 않습니다.
술어가 노드의 위치를 테스트하는 경우 술어 순서는 중요합니다.각 술어는 노드 세트를 취하면 (잠재적으로) 더 작은 노드 세트를 반환합니다.그렇게a[1][@href='help.php']
일치하는 것을 찾을 수 있는 것은 첫 번째 경우뿐입니다.a
콘텍스트 노드의 자녀는 조건을 충족합니다.@href='help.php'
,하는 동안에a[@href='help.php'][1]
첫 번째를 찾을 것이다a
이 조건을 만족시키는 아이.
함수 및 연산자
XPath 1.0은 노드 집합(내재 순서가 없는 노드 집합), 문자열, 숫자 및 부란의 4가지 데이터 유형을 정의합니다.
사용 가능한 연산자는 다음과 같습니다.
- 그
/
,//
그리고.[...]
연산자, 위에서 설명한 바와 같이 경로 표현에서 사용됩니다. - 노조 운영자,
- 부울 연산자
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()
보다 일반적으로 유용한 기능 중 [c]몇 가지를 아래에 자세히 설명합니다.
노드 세트 함수
- 위치()
- 는 현재 처리 중인 노드 시퀀스에서 이 노드의 위치를 나타내는 숫자(XSLT의 xsl: for each 명령으로 선택된 노드 등)를 반환합니다.
- 카운트(노드 세트)
- 는 인수로 지정된 노드 세트 내의 노드 수를 반환합니다.
문자열 함수
- string(개체)
- 는 내장된 규칙에 따라 4가지 XPath 데이터 유형 중 하나를 문자열로 변환합니다.인수 값이 노드 집합인 경우 함수는 문서 순서대로 첫 번째 노드의 문자열 값을 반환하고 이후 노드를 무시합니다.
- concat(string, string, string*)
- 두 개 이상의 문자열을 연결합니다.
- starts-with (s1, s2)
- 돌아온다
true
한다면s1
로부터 시작하다s2
- 포함(s1, s2)
- 돌아온다
true
한다면s1
포함하다s2
- 서브스트링(string, start, length)
- 예:
substring("ABCDEF",2,3)
돌아온다BCD
. - 서브스트링 전(s1, s2)
- 예:
substring-before("1999/04/01","/")
돌아온다1999
- 서브스트링 애프터(s1, s2)
- 예:
substring-after("1999/04/01","/")
돌아온다04/01
- string-length(string)
- 문자열의 문자 수를 반환합니다.
- normalize-space(문자열)
- 선행 및 후행 공백이 모두 제거되고 공백 문자의 시퀀스가 단일 공백으로 대체됩니다.이 기능은 원래 XML이 예쁜 인쇄 형식이어서 더 이상의 문자열 처리를 신뢰할 수 없는 경우 매우 유용합니다.
부울 함수
- 없음(비활성화)
- 는 부울식을 모두 부정합니다.
- true()
- true로 평가합니다.
- false()
- false로 평가됩니다.
숫자 함수
- sum(노드 세트)
- 는 임베디드 캐스팅 규칙에 따라 XPath 인수에 의해 검출된 모든 노드의 문자열 값을 숫자로 변환한 후 이들 숫자의 합계를 반환합니다.
사용 예
표현식은 다음 연산자를 사용하여 술어 내에 작성할 수 있습니다.=, !=, <=, <, >=
그리고.>
부울식은 괄호와 조합할 수 있습니다.()
및 부울 연산자and
그리고.or
뿐만 아니라not()
위의 기능을 수행합니다.수치 계산은 다음을 사용할 수 있습니다.*, +, -, div
그리고.mod
. 문자열은 임의의 Unicode 문자로 구성할 수 있습니다.
//item[@price > 2*@discount]
가격 속성이 할인 속성의 숫자 값의 2배를 초과하는 항목을 선택합니다.
세로 막대 문자를 사용하여 전체 노드 집합을 결합('연합')할 수 있습니다. 여러 조건 중 하나 이상을 충족하는 노드 집합은 '과(와) 결합하여 찾을 수 있습니다.or
'.
v[x or y] w[z]
모든 노드로 구성된 단일 노드 세트를 반환한다.v
가지고 있는 요소x
또는y
육아와 더불어w
가지고 있는 요소z
현재 컨텍스트에서 발견된 아동 보호.
구문 및 의미론(XPath 2.0)
구문 및 의미론(XPath 3)
예
샘플 XML 문서 지정
<?xml version="1.0" encoding="utf-8"?> <Wikimedia> <backet> <프로젝트명="Wikipedia" launch="2001-01-05"> <backet> <backet language="English">en.wikipedia.org </filength> <blanguage="독일어">de.wikipedia.org </filength> </filength> <외국어>프랑스어">fr.wikipedia.org </filength> </filength> <외국어>「광택」> 「 」wikipedia.org </http> </http> <blanguage="스페인어">es.wikipedia.org </project> </project> </project> </project> <프로젝트명="Wiktionary" launch="2002-12-12"> <backet> <backet> <backet language="English">en.wiktionary.org </filength> </filength> <외국어>프랑스어">fr.wiktionary.org </vi> <vi 언어="베트남어">wiktionary.org </filength> </filength> <외국어>터키어"> tr.wiktionary.org </http> </http> <blanguage="스페인어">es.wiktionary.org </wikimedia> </wikimedia> </wikimedia> </project> </wikimedia>
XPath 표현
/Wikimedia/projects/project/@name
모든 프로젝트의 이름 속성을 선택하고
/Wikimedia// 에디션
모든 프로젝트의 모든 에디션을 선택합니다.
/Wikimedia/projects/project/editions/edition[@language='English']/text()
모든 영어 Wikimedia 프로젝트 주소 선택(모두 텍스트)edition
요소language
Atribute는 English와 동일합니다).그리고 다음과 같습니다.
/Wikimedia/projects/project[@name='Wikipedia']/editions/edition/text()
모든 Wikipedias 주소 선택(모두 텍스트)edition
아래에 존재하는 요소project
Wikipedia의 이름 속성을 가진 요소).
실장
명령줄 도구
- XMLStarlet은 XPath 명령어를 테스트/실행하기 위한 사용하기 쉬운 도구입니다.
- xmlint(libxml2)
- Altova의 RaptorXML 서버는 XPath 1.0, 2.0 및 3.0을 지원합니다.
- 시델
C/C++
프리 파스칼
- XPath 유닛은 기본 라이브러리에 포함되어 있습니다.
데이터베이스 엔진 구현
자바
- Saxon XSLT는 XPath 1.0, XPath 2.0 및 XPath 3.0을 지원합니다(XSLT 2.0, XQuery 3.0 및 XPath 3.0도 지원).
- BaseX(XPath 2.0 및 XQuery도 지원)
- VTD-XML
- Sedna XML 데이터베이스 XML:DB 및 독자 사양.
- QuiXPath Innovimax 스트리밍 오픈 소스 구현
- 잘란
- 돔4j
Java 패키지는 Java[8] 5부터 Java API for XML Processing을 통한 Java 표준 에디션의 일부입니다.기술적으로 이것은 XPath가 아닌 XPath API로 프로그래머가 인터페이스에 적합한 특정 구현을 선택할 수 있도록 합니다.
자바스크립트
- JavaScript의 오픈 소스 XPath 2.0 구현을 기반으로 한 jQuery XPath 플러그인
- JavaScript에서의 FontoXPath 오픈소스 XPath 3.1 구현.현재 개발 중입니다.
.NET 프레임워크
- 시스템 내XML 및 시스템.Xml.XPath 네임스페이스[9]
- Sedna XML 데이터베이스
펄
- XML:: LibXML(libXML2)
PHP
- Sedna XML 데이터베이스
- libxml 확장을 통한 DOMXPath
파이썬
- 요소Python Standard Library의 Tree XML API는 XPath 식을 제한적으로 지원합니다.
- libxml2
- 아마라
- Sedna XML 데이터베이스
- lxml
- 스크래피[10]
루비
스킴
- Sedna XML 데이터베이스
SQL
- MySQL은 버전 5.1.5 이후[11] XPath 서브셋을 지원합니다.
- PostgreSQL은 버전 8.4 이후[12] XPath 및 XSLT를 지원합니다.
TCL
- tDOM 패키지는 C에서[13] 완전하고 컴플라이언스 있는 고속 XPath 구현을 제공합니다.
스키마 언어로 사용
XPath는 XML에 대한 스키마 언어로 제약을 표현하기 위해 점점 더 많이 사용되고 있습니다.
- (현재의 ISO 표준) 스키마 언어 Schematron이 이 접근방식을 개척했습니다.
- W3C XML Schema 1.0에서는 XPath의 스트리밍 서브셋을 사용하여 일의성 및 키 제약을 표현합니다.XSD 1.1에서 XPath의 사용은 속성값에 기초한 조건부 유형 할당을 지원하고 요소의 내용에 대해 임의의 부울 어사션을 평가할 수 있도록 확장된다.
- XForms는 XPath를 사용하여 유형을 값에 바인딩합니다.
- 이 접근법은 PMD라는 Java용 소스 코드 분석기 등 XML이 아닌 응용 프로그램에서도 사용할 수 있습니다.Java는 DOM과 같은 해석 트리로 변환되고 XPath 규칙이 트리에 정의됩니다.
「 」를 참조해 주세요.
메모들
레퍼런스
- ^ a b "XML and Semantic Web W3C Standards Timeline" (PDF). 2012-02-04.
- ^ Bergeron, Randy (2000-10-31). "XPath—Retrieving Nodes from an XML Document". SQL Server Magazine. Archived from the original on 2010-07-26. Retrieved 2011-02-24.
- ^ Pierre Geneves (2012). "Course: The XPath Language" (PDF).
- ^ "XML Path Language (XPath) 3.0". World Wide Web Consortium (W3C). 2014-04-02. Retrieved 2021-07-16.
- ^ Kay, Michael (2012-02-10). "What's new in 3.0 (XSLT/XPath/XQuery) (plus XML Schema 1.1)" (PDF). XML Prague 2012. Retrieved 2021-07-16.
- ^ "XML Path Language (XPath) 3.1". World Wide Web Consortium (W3C). 2017-03-21. Retrieved 2021-07-16.
- ^ Walsh, Norman (1999). "Axis Specifiers". nwalsh.com. Personal blog of venerated XML sage graybeard. Retrieved 2021-02-25.
- ^ "javax.xml.xpath (Java SE 10 & JDK 10)". Java® Platform, Standard Edition & Java Development Kit Version 10 API Specification. Retrieved 2021-07-17.
Since: 1.5
- ^ "System.Xml Namespace". Microsoft Docs. 2020-10-25. Retrieved 2021-07-16.
- ^ Duke, Justin (2016-09-29). "How To Crawl A Web Page with Scrapy and Python 3". Digital Ocean. Retrieved 2017-11-24.
Selectors are patterns we can use to find one or more elements on a page so we can then work with the data within the element. scrapy supports either CSS selectors or XPath selectors.
- ^ "MySQL :: MySQL 5.1 Reference Manual :: 12.11 XML Functions". dev.mysql.com. 2016-04-06. Archived from the original on 2016-04-06. Retrieved 2021-07-17.
{{cite web}}
: CS1 유지보수: 부적합한 URL(링크) - ^ "xml2". PostgreSQL Documentation. 2014-07-24. Retrieved 2021-07-16.
- ^ Loewer, Jochen (2000). "tDOM – A fast XML/DOM/XPath package for Tcl written in C" (PDF). Proceedings of First European Tcl/Tk User Meeting. Retrieved 16 July 2021.
외부 링크
