경로 표현식
XPath 표현식(expression)
XPath에서는 XML 문서의 노드나 노드셋(node-set)을 선택하기 위해 다양한 표현식을 사용합니다.
이번 수업의 예제에서 사용되는 programming_languages.xml 파일의 코드는 다음과 같습니다.
위치 경로(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)은 현재 노드를 기준으로 어느 방향으로 검색해 나갈지를 명시합니다.
XPath에서 사용할 수 있는 검색 방향(axis step)은 다음과 같습니다.
검색 방향 | 설명 |
---|---|
self | 현재 노드를 선택함. |
attribute | 현재 노드의 속성 노드를 모두 선택함. |
namespace | 현재 노드의 네임스페이스 노드를 모두 선택함. |
child | 현재 노드의 자식 노드를 모두 선택함. |
descendant | 현재 노드의 자손 노드를 모두 선택함. |
descendant-or-self | 현재 노드와 현재 노드의 자손 노드를 모두 선택함. |
following | XML 문서에서 현재 노드의 종료 태그 이후에 등장하는 모든 노드를 선택함. |
following-sibling | 현재 노드 이후에 위치하는 형제 노드를 모두 선택함. |
parent | 현재 노드의 부모 노드를 선택함. |
ancestor | 현재 노드의 조상 노드를 모두 선택함. |
ancestor-or-self | 현재 노드와 현재 노드의 조상 노드를 모두 선택함. |
preceding |
XML 문서에서 현재 노드 이전에 등장하는 모든 노드를 선택함. (조상 노드, 속성 노드, 네임스페이스 노드는 제외함) |
preceding-sibling | 현재 노드 이전에 위치하는 형제 노드를 모두 선택함. |
경로 표현식(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>요소를 모두 선택함.
다음 예제는 현재 노드의 자손 노드를 모두 선택하는 예제입니다.