2015년 2월 20일 금요일

xpath 의 개념과 문법

목차


xpath의 개념

우린 파일을 찾을때 탐색기를 이용한다
탐색기는 미지의 장소를 그냥 탐험하는게아니라
길, 즉 path를 따라가서 원하는 곳을 찾아내는데
C:\windows\System32\important\왜가리
위와 같은 형식이고 이것이 윈도의 path 문법이다

마찬가지로 xml도 원하는 태그나 속성을 쉽게 찾기 위해
path문법을 만들게 되었고 xpath라 명명하게되었다

xpath의 Node

xml도 윈도처럼 단순히 파일과 디렉토리만 딸랑 있다면 매우좋았을 것이나
불행히도 <body style="sexy" class="top"> -ㅠ- </body> 이런식으로
우리가 찾아야할 것은 body라는 태그 하나로 끝나는 것이 아니다
각 태그에는 속성도 있고 속성값도 있고 태그의 내용물도 있다
그래서 이걸 어찌해야하나 고민하다가
그냥 모조리 node 라는 단위로 퉁쳐버렸다
<body style="sexy" class="top"> -ㅠ- </body>
위는 5개의 노드로 이뤄졌다고 할 수 있다
이렇게 노드로 만들고 나니 각 노드들 중에 동일한 타입들이 존재했다.
xml을 완전히 분해해봤을때 6가지 타입만 있으면 xml은 쫑이었다
그래서 노드들을 더욱 찾기쉽게 각 타입마다 이름을 붙여주었는데
그 과정에서 얘네들을 전부 포함하는 가상의 타입이 하나 추가되었다. 그게 다음과 같다

노드명 설명
root node 1w3school에서는 Document node라 되어 있는데 그런 노드는 없다. http://www.w3.org/TR/xpath/ 참조 ↩ xml 자체를 표현하는 가상 노드
element node 태그
attribute node 속성
text node 태그 내용
namespace node xmlns: 로 시작하는 태그
processing-instruction node <?xml version="1.0" encoding="UTF-8" ?>
이렇게 <? 태그로 시작하는 애들을 말한다
comment node 주석문

7공주도 아니고 성질나게 많지만 다행이
자주 사용하는 것은 element와 attribute 노드이고
xpath의 사용법도 이들에 집중되어 있으니
element node, attribute node, text node
요렇게만 알고 있어도 끝이다

xpath 문법

자 이제 한번 xml의 신비로운 육체를 탐험해보자..-ㅅ-
너무 신비로운 나머지 쪼매 복잡한데
다 때려치우고 쉬운것만 맛보자
그것만으로도 왠만한건 다 해치울 수 있다

element node

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
 
<bookstore>
 
<book>
  <title lang="en">Harry Potter</title>
  <price>29.99</price>
</book>
 
<book>
  <title lang="en">Learning XML</title>
  <price>39.95</price>
</book>
 
</bookstore>

위에서 book 태그를 찾아 들어가고 싶다면?
윈도처럼 쓰면 아래와 같은데
/bookstore/book
윈도에선 book 이라는 이름 하나는 하나만 찾는다는 소리지만
xpath에서는 NodeName 은 기본적으로 모든(ALL)을 뜻한다.
왜냐.. 윈도에는 같은 이름 디렉토리를 못만드는 반면 xml은
같은 태그를 줄창 만들 수 있으니까..-ㅅ-;;

하지만 원하는 것만 찾는 방법도 필요할터..
그래서 조건을 걸때를 위해 [] 대괄호를 제공해준다
아래는 첫번째 book만 찾아준다
/bookstore/book[1]

수식도 쓸 수 있다
/bookstore/book[price>35.00]

자.. 다시 해석하면
모든 bookstore 아래의 모든 price 의 값이 35 이상인 모든 book
이 되시겠다2어? 위의 book[1]은 그럼 book의 value가 1인거 아닌가요? 라고 할 수 있는데 숫자만 쓰여졌으면 걍 순서고 직접적으로 element랑 비교수식이 있으면 자동으로 값과 비교된다 머리아프니 걍 그런줄 알고 넘어가자 ↩
또한 //book 이렇게 쓰면 모든 book을 찾아준다
bookstore//book 이럴 경우는 bookstrore 안쪽의 모든 book을 찾는다
즉, 아래쪽의 모든 것을 찾을땐 //을 쓴다
book 그냥 이렇게 쓸 경우 현재 있는 곳에서 모든 book을 찾는다
저 위의 예제에서 저렇게 쓰면 암것도 못찾는다
book은 bookstore 아래에 있기 때문이다

attribute node

여기서 날카로운 사람이면 의문을 가질 수 있을 것이다
위에서 7개의 노드가 있다고 했는데 이런식이면
저건 Element 노드만 찾는게 아닌가.. 라고..
맞다. 앞서 말했듯이 xpath는 7개 노드 만들긴 했는데
딴건 워낙 잘 안쓰니까 가장 잘 쓰는 Element 노드는 위에처럼
걍 써도 되는 특권을 줬고
그 다음 잘 쓰는 Attribute 노드의 경우 앞에 @를 붙인다
//@lang
이럴 경우는 모든 곳에서 lang Attribute 노드를 찾는다
참고로 lang 속성을 가진 Element 노드를 찾는게 아니다
정확히 Atrribute 노드만 반환한다

그럼 저 속성을 가진 Element 즉, 태그를 찾고 싶다면?
앞서의 조건을 걸려면 [] 대괄호를 쓴다고 했다 그대로 하면된다
//title[@lang]
이러면 lang 속성을 가진 title 태그 노드를 반환한다

text node

마지막으로 또 하나의 중요한 노드인 Text 노드를 찾고 싶다면?
text()
를 사용한다. text 노드는 태생 자체가 엘리먼트 노드인 태그안에만 존재하기 때문에 문법도 일단 처음에 엘리먼트 노드가 나와야만 한다
//title/text()
모든 title 태그 에 있는 Text 노드 추출

//text()
모든 태그안의 text 추출

xpath 테스트

그외에도 선택자로 찾기도 있고 그런데 여기까지 알았으면
그것들을 사용하는 것도 크게 어렵진 않다
문법을 참고한 후
http://www.w3schools.com/xpath/xpath_syntax.asp

이 사이트에서 연습해보면 xpath를 자유자재로 사용가능하게되고
이제 인간 XML 탐색기로 거듭나게 될 것이다 +_+
http://www.xpathtester.com/xpath

Written with StackEdit.


  1. w3school에서는 Document node라 되어 있는데 그런 노드는 없다. http://www.w3.org/TR/xpath/ 참조
  2. 어? 위의 book[1]은 그럼 book의 value가 1인거 아닌가요?
    라고 할 수 있는데 숫자만 쓰여졌으면 걍 순서고
    직접적으로 element랑 비교수식이 있으면 자동으로 값과 비교된다
    머리아프니 걍 그런줄 알고 넘어가자

Related Posts:

  • 프로그래밍에서 용어와 영어의 중요성이름 짓기 프로그래밍을 배우면서 영어권 애들이 진짜 부러웠던게 바로 이 언어문제다. 어떤 프로그래밍 용어든.. 그것이 선정될 때는 개 이름 짓듯이 별탱이, 다롱이처럼 하지 않고 가장 그것의 용도를 적합하게 나타내는 이름으로 짓는다 그래서 용어가 자국어인 사람들은 훨씬 빨리 이해하고 배울 수 있다 영어권이 아닌 나라들 그럼 영어권이 아닌 나라들은? 당연하지만 번역해서 쓴다 그중에선 도저… Read More
  • 입출력 스트림의 개념스트림 어느 한 방향으로의 물결, 흐름을 의미한다 우린 인생스트림을 나아가고 있다고도 할 수 있다 하지만 구체적으로는 추상적 의미보단 놀이동산에 줄지어 서 있듯이, 혹은 은하수처럼 뭔가의 물체들이 끊김없이 늘어서 있는 것이라고 볼 수 있다. 프로그램에서는 통로, 길의 의미가 가장 적합하다 입출력 스트림 InputStream 과 OutputStream 은 말그대로 입출력하는 통로, 길을… Read More
  • 동기와 비동기 개념목차 동기(synchronous) 비동기(asynchronous) 개념정리 동기와 비동기는 완벽하게 용어적으로 차이가 있지만 실제 그 차이가 뭔지는 이상하게도 파악하기가 쉽지 않다 그래서 동기와 비동기의 차이점과 개념을 정리해 보았다 동기(synchronous) 싱크로 되었다.. 라는 말은 들어본적이 있을지도 모른다 더 쉽게 싱크로나이즈드 스위밍은 들어봤을 것이다 … Read More
  • Git 시작하기 3 - commit목차 git commit 명령어 global 설정 git commit -m git add의 비밀과 git의 3단계 시스템 git commit -am git commit 명령어 global 설정 추적도 되었겠다. 이제 백업만 하면 된다 그것을 해주는 명령어가 바로 git commit 이 되시겠다 일단 git commit을 쳐보자 그럼 git가 넌 누구냐 (-ㅅ- … Read More
  • Git 시작하기 두번째목차 Git의 기묘한 화면 Git는 어렵지 않아요 Git 전용 백업 폴더 만들기 Git에게 명령을 시켜보자 git status - 보고해 git! git add - 스토킹을 시작합니다 git 명령어 옵션 Git의 기묘한 화면 앞서 Git 시작하기를 통해 Git를 시작하진 않고 버전 관리 시스템의 기본을 알게 되었다. -ㅅ-; 하지만 Git가 무슨 과학자들의 기묘한 발명품… Read More

댓글 1개 :

  1. 대용량 XML파일을 빠르게 검색할수는 없을까요??
    10기가가 넘는 XML 파일에서 검색하려는데 오래걸리네욤

    답글삭제