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()
|