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 1 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

<?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 이렇게 쓰면 모든 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랑 비교수식이 있으면 자동으로 값과 비교된다
    머리아프니 걍 그런줄 알고 넘어가자

댓글 1개 :

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

    답글삭제