출처 Hello Krinlion <Comming Soon Blog.krinlion.com> | 키린라이온
원문 http://blog.naver.com/krinlion/40131010957

1. Xpath(XML Path Language)란?

ㄱ) XML 문서에서 특정엘리먼트나 속성 접근하기 위해 경로를 지정하는 언어
ㄴ) XPath는 XSLT와 XPointer 언어에 사용될 목적으로 설계된 언어.
(XPath 언어 없이는 XSLT언어로 XSL문서를 작성할 수 없다.)
(XPath 는 공식적으로 XSL의 한 부분이다.)
ㄷ) XPath는 XML문서의 특정 부분에 자유자재로 접근할 수 있는 기능을 제공한다.
ㄹ) XML 문서는 트리 구조로 구조화 되어 있기 때문에 XML문서 내의 특정 부분에 접근하기 위해서는
XPath라는 약속된 경로 표기법을 사용해야 한다.
ㅁ) 절대 경로와 상대경로 사용가능.
-절대 경로는 '/'로 시작
-상대 경로는 '.'(현재단계) '..'(상위단계)을 사용.
ㅂ) XPath는 문자열, 숫자 , boolean, 함수도 있다.

 

XPath는 XSLT와 XPointer 언어의 핵심 구성요소 이며,

XML문서의 프로그램 API인 DOM(Document Object Model)에서 노드를 검색할 때 사용된다.

 

 


2. 노드와 노드 셋

노드: 트리구조의 매듭에 해당하는 것

노드셋(노드집합) : 동일 노드들의 집합.

 

[노드 종류]

1. 루트노드(root node)
xml문서 자체를 표현하는 최상위 노드
루트엘리먼트(booklist)의 부모노드
2.엘리먼트 노드(element node) :
엘리먼트를 표현하는 노드
3.속성노드(attribute node) :
속성을 표현하는 노드
(주의) 네임스페이스는 속성 노드로 표현하지 않는다.
4. 텍스트 노드(text node) :
Content 내용 문자 데이터를 표현하는 노드
트리 구조상의 최말단 노드.

5. 프로세싱 지시자 노드(processing instruction node)
프로세싱 지시자를 표현하는 노드
6. 주석 노드(comment node) : 주석을 표현하는 노드

 

 

 

 

 

 

3. Location Path

ㄱ) Location Path는 XML문서의 각 노드들에 대한 위치
를 지정하기 위한 XPath표현식이다.
ㄴ) Location Path는 절대 경로와 상대 경로
ㄷ) 절대 경로 /
예)
/Location Step/Location Step/.../Location Step

ㄹ) 상대 경로 . ..
예)
Location Step/~ /Location Step
./Location Step/~ /Location Step
../Location Step/~ /Location Step

 

 

 

 

 

4. Location Step 작성 문법

형식

Axis::NodeTest[Predicate]
Axis 노드를 찾기 위한 검색방향(축)
NodeTest 찾을 노드 이름
Predicate 필터링을 하기 위한 표현식 기술

 

 

 


Axis(축) 종류

 

 

a) ancestor 축 ( 조상 )
: 기준 노드의 모든 조상
b) ancestor-or-self 축
: 기준노드 + 기준노드의 조상
c) parent 축 : 기준노드의 부모
d) self 축 : 기준노드
self::node() --> 자기 자신 노드
e) attibute 축 : 기준노드(엘리먼트노드)의 속성노드
f) child축 : 기준 노드의 바로 아래단계의 자식노드만
g) descendant 축 : 기준 노드의 모든 자식노드.
h) descendant-or-self 축 :
기준 노드의 모든 자식노드+기준노드.
i) preceding 축 : 기준노드보다 앞선 모든 노드
j) preceding-sibling 축 :
기준노드보다 앞선 노드 중 형제 노드
k) following 축: 기준 노드보다 뒤에 따라오는 모든 노드
i) following-sibling 축: 기준 노드보다 뒤에 따라오는 형제 노드

 

 

 

 

 

XML문서

<?xml version="1.0" encoding="utf-8" ?>

<booklist>
<book id="b1">
<title>C#</title>
<price>5000</price>
</book>
<book id="b2">
<title>asp.net</title>
<price>3000</price>
</book>
<book id="b3">
<title>java</title>
<price>3500</price>
</book>
<book id="b4">
<title>vb</title>
<price>5000</price>
</book>
</booklist>

 

 

 

 

 

DOM구조

 

 

 

 

 

 

NodeTest에 올 수 있는 것들

(a) 축::엘리먼트명
지정된 축에서 해당 엘리먼트명을 갖는 노드를 선택
(b) 축::속성명
지정된 축에서 해당 속성명을 갖는 노드들을 선택
c) 축::*
지정된 축의 모든 엘리먼트 노드들을 선택
d) 축::접두사:*
지정된 네임스페이스 접두사를 갖는 모든 노드 선택
e)축:접두사:로컬이름
지정된 네임스페이스 접두사를 갖고 로컬이름과 동일한
노드들을 선택
f) 축::node()
지정된 축의 모든 노드(엘리먼트,텍스트 노드 등)들을 선택
g) 축::comment()
지장된 축의 모든 주석 노드들을 선택
h) 축::text()
지정된 축의 모든 텍스트 노드들을 선택
i) 축::processing-instruction
지정된 축의 모든 PI노드들을 선택

 

 

 

 

 

Predicate

a)선택된 노드 중에서 특별한 노드를 선택하기 위한 (조건문,TRUE,FALSE) 표현식
b)-조건문에서 사용될 수 있는 연산자
*,-,div,mod,+,<,>,<=,>=,=,!= ,and,or
c)주로 많이 사용되는 Predicate 표현식
-축::노드명1[child::노드명2="값"]
축방향으로 찾고자하는 노드명1의자식 노드명2 중에 콘텐트(내용)이 "값"인 노드 선택
-축::노드명[attribute::속성명="값"]

-축::노드명[contains(child::노드명="값")]

 

 

 

 

 

5. 단축형 Location Step 작성 문법

a) child::엘리먼트명 ==> 엘리먼트명
b) /child::엘리먼트명/child::엘리먼트명
==>/엘리먼트명/엘리먼트명
c)/child::엘리먼트명[child::엘리먼트명="값"]
==>/엘리먼트명[엘리먼트명="값"]
d) attribute::속성명==>@속성명
e)/child::엘리먼트명/attribute::속성명
==>/엘리먼트명/@속성명
f) desecndant-or-self::엘리먼트명(//최상위 부모노드로부터)
==>//엘리먼트명
g)/child:엘리먼트명/descendant-or-self엘리먼트명
==>/엘리먼트명//엘리먼트명
h)self::node() ==>.
i)parent::node() ==>..
예) ../price
j)/child::엘리먼트명/parent::node()/
==>엘리먼트명/../엘리먼트명

 

 

 

 

 

예제

1)절대경로 표현식, booklist에 자식인 book을 선택
/booklist/book 반드시 booklist 밑에 있는 book밑에 있는 book찾아라.
//book 모든 book 엘리먼트를 찾아라..
지금트리구조에서는 같은 의미이다.
2)절대 경로 표현식 book의 자식 price선택
/booklist/book/price
3)특정 book현재 노드 위치라고 가정하고
자식인 title노드를 찾아라를 상대경로표현식으로
./title
4)현재 title노드가 기준노드라 치고 형제노드인
price를 찾아라를 상대경로표현식으로
../price
5)현재 title노드가 기준노드라 치고 부모노드의 id속성값을
찾아라를 상대경로 표현식으로
../@id

 

 

 

 

 

 

6.Xpath 함수(4종류)

ㄱ)노드정보 반환 함수

number last() : 마지막 노드 위치 반환
/booklist/book[last()]
number position() :현재노드 위치 반환
/booklist/book[position()=2] '='같다의 의미
/booklist/book[position()=last()] 은 /booklist/book[last()]와 같다
number count(node-set):노드 갯수 반환
count(/booklist/book)
node-set id(object) : 고유한 id가지는 노드셋 반환
string local-name(node-set?) : 로컬이름 반환
string name() : QName반환
string namespace-uri() : 접두사 반환

 

 

 

 

 

ㄴ)문자열 관련 함수

string string(object?)
string concat(string,string,string*)
boolean starts-with(string,string)
예)/booklist/book[starts-with(title,'V')]


boolean contains(string,string)
예)/booklist/book[contains(title,'.net')]

string substring-before(string,string)
string substring-after(string,string)
string substring(string,number,number?)
number string-length(string?)
string translate(string,string,string)
string normalize-space(string?) //trim()함수와 같다

 

 

 

 

 

 

ㄷ)참/거짓 반환 함수

boolean not(boolean)
예)/booklist/book/[not(contains(title,'V'))]

 

 

 


ㄹ)숫자관련함수

number(),sum(),floor(),ceiling(),round()

 

+ Recent posts