본문 바로가기
XML

XML XPath

by FraisGout 2020. 7. 3.

XPath?

XPathXML Path Language를 의미합니다.

 

XPathXML 문서의 특정 요소나 속성에 접근하기 위한 경로를 지정하는 언어입니다.

 

XPathW3C 표준 권고안으로, XSLTXPointer에 사용될 목적으로 만들어졌습니다.

 

또한, XML DOM에서 노드를 검색할 때에도 사용할 수 있습니다.

 

XPath의 특징

XPathXML 문서의 일부분을 선택하고 처리하기 위해 만들어진 언어입니다.

 

이러한 XPath는 다음과 같은 특징을 가집니다.

 

 

 

1. XPathXML 문서를 탐색하기 위해 경로 표현식(path expression)을 사용합니다.

 

2. XPath는 수학, 문자열 처리 등을 하기 위한 표준 함수 라이브러리를 내장하고 있습니다.

 

3. XPathW3C의 표준 권고안인 XSLT에서 가장 중요한 부분 중 하나입니다.

 

XPath 노드의 형식

XPath에서 사용하는 노드의 형식은 다음과 같이 구분됩니다.

 

 

 

1. 루트 노드

 

2. 요소 노드

 

3. 텍스트 노드

 

4. 속성 노드

 

5. 주석 노드

 

6. 네임스페이스(namespace) 노드

 

7. 처리 명령(processing instruction) 노드

 

XPath 표현식(expression)

XPath에서는 XML 문서의 노드나 노드셋(node-set)을 선택하기 위해 다양한 표현식을 사용합니다.

노드셋(node-set)이란 중복을 허용하지 않는 노드들의 순서없는 집합을 의미합니다.

 

위치 경로(location path)

위치 경로(location path)XML 문서의 각 노드의 위치를 지정하기 위한 XPath 표현식입니다.

 

위치 경로는 절대 경로와 상대 경로로 구분할 수 있습니다.

 

 

 

- 절대 경로는 슬래시(/)로 시작하며, 루트 노드부터 순서대로 탐색해 나갑니다.

 

- 상대 경로는 슬래시(/)로 시작하지 않으며, 기준으로 지정되는 노드부터 탐색해 나갑니다.

 

 

 

위치 경로는 모두 시작 위치 이외에도 슬래시(/)로 구분되는 여러 단계(step)를 포함할 수 있습니다.

 

예제

developer : <developer>요소를 모두 선택함.

 

/p_languages : 루트 노드의 자식 노드인 <p_languages>요소를 선택함. (절대 경로 탐색)

 

p_languages/language : <p_languages>요소의 자식 노드 중 <language>요소를 모두 선택함. (상대 경로 탐색)

 

// : 루트 노드의 하위 노드를 모두 선택함.

 

//priority : 위치에 상관없이 <priority>요소를 모두 선택함.

 

.// : 현재 노드의 하위 노드를 모두 선택함.

 

version/@status : 모든 <version>요소의 status 속성 노드를 모두 선택함.

위치 경로가 슬래시(/)로 시작하면 언제나 단 하나의 요소만을 가리키는 절대 경로를 나타냅니다.

 

다음 예제는 위치에 상관없이 <version>요소를 모두 선택하는 예제입니다.

 

예제

var xmlObj, path, result, nodeList, node;

 

xmlObj = xmlHttp.responseXML;

 

path = "//version";

 

result = "";

 

 

 

// 익스플로러를 위한 코드

 

if (window.ActiveXObject !== undefined || xmlHttp.responseType == "msxml-document") {

 

xmlObj.setProperty("SelectionLanguage", "XPath");

 

nodeList = xmlObj.selectNodes(path);

 

for (i=0; i<nodeList.length; i++) {

 

result += nodeList[i].text + "<br>";

 

}

 

 

 

// 익스플로러를 제외한 브라우저를 위한 코드

 

} else if (document.implementation && document.implementation.createDocument) {

 

nodeList = xmlObj.evaluate(path, xmlObj, null, XPathResult.ANY_TYPE, null);

 

node = nodeList.iterateNext();

 

while (node) {

 

result += node.firstChild.nodeValue + "<br>";

 

node = nodeList.iterateNext();

 

}

 

}

 

document.getElementById("text").innerHTML = result;

 

노드를 찾기 위한 검색 방향 설정

XPath에서 검색 방향(axis step)은 현재 노드를 기준으로 어느 방향으로 검색해 나갈지를 명시합니다.

 

경로 표현식(path expression)

XPath에서는 노드를 선택하기 위해 경로 표현식(path expression)을 사용합니다.

 

 

 

XPath에서 경로 표현식을 작성하는 문법은 다음과 같습니다.

 

문법

검색방향::노드테스트[필터표현식]

 

 

 

1. 검색 방향 : 현재 노드를 기준으로 노드를 검색할 방향을 전달합니다.

 

2. 노드 테스트 : 검색 방향에 존재하는 해당 노드를 검색합니다.

 

3. 필터 표현식 : 검색된 노드셋(node-set)에서 특정 노드나 특정 값을 포함하는 노드를 선택합니다.

 

 

 

예제

child::language : 현재 노드의 자식 노드 중 <language>요소를 모두 선택함.

 

attribute::version : 현재 노드의 version 속성 노드를 선택함.

 

descendant::* : 현재 노드의 자손 노드를 모두 선택함.

 

descendant::text() : 현재 노드의 자손 노드 중 텍스트 노드를 모두 선택함.

 

ancestor::language : 현재 노드의 조상 노드 중 <language>요소를 모두 선택함.

 

ancestor-or-self::language : 현재 노드와 현재 노드의 조상 노드 중 <language>요소를 모두 선택함.

 

child::*/child::category : 현재 노드의 자식 노드의 자식 노드 중 <category>요소를 모두 선택함.

 

 

 

다음 예제는 현재 노드의 자손 노드를 모두 선택하는 예제입니다.

 

예제

 

 

path = "descendant::*";

 

필터 표현식(filter expressions)

XPath에서는 특정 노드나 특정 값을 포함하는 노드를 선택하기 위해 필터 표현식(filter expressions)을 사용합니다.

 

 

 

필터 표현식은 언제나 대괄호([]) 안에 표현됩니다.

 

이러한 필터 표현식에 XPath 함수를 사용하면 더욱 자세한 필터링을 할 수 있습니다.

 

 

 

예제

p_languages/language[1] : <p_languages>요소의 자식 노드 중 첫 번째 <language>요소를 선택함.

 

p_languages/language[position() < 3] : <p_languages>요소의 자식 노드 중 처음 두 개의 <language>요소를 선택함.

 

p_languages/language[last()] : <p_languages>요소의 자식 노드 중 마지막 <language>요소를 선택함.

 

//priority[@rating] : rating 속성을 가지고 있는 <priority>요소를 모두 선택함.

 

//priority[@rating = 3] : rating 속성의 속성값이 3<priority>요소를 모두 선택함.

 

count(//language) : 모든 <language>요소의 개수를 반환함.

 

XPath 함수

XPath 함수는 선택된 노드셋을 평가하여 조건에 맞는 노드를 시퀀스 형태로 반환합니다.

 

임의 문자 기호(wild card)

XPath에서는 임의의 노드를 선택하기 위해 임의 문자 기호(wild card)를 사용할 수 있습니다.

 

예제

../* : 현재 노드의 부모 노드의 자식 요소 노드를 모두 선택함.

 

//* : 현재 문서의 모든 요소 노드를 선택함.

 

//priority[@*] : 어떠한 종류의 속성 노드라도 적어도 하나 이상 가지고 있는 <priority>요소를 모두 선택함.

 

연산자(operator)

예제

//language/name | //language/version : 모든 <language>요소의 <name>요소와 <version>요소를 모두 선택함.

 

//name | //version : 현재 문서의 <name>요소와 <version>요소를 모두 선택함.

 

/language/version/@status | //version : <language>요소의 <version>요소의 status 속성을 모두 선택하고,

 

현재 문서의 <version>요소도 모두 선택함.

'XML' 카테고리의 다른 글

XML XSD  (0) 2020.07.03
XML DTD  (0) 2020.07.03
XML DOM  (0) 2020.07.03
XML XSL  (0) 2020.07.03
XML 기본  (0) 2020.07.03

댓글