XPath

Development/XML 2013. 2. 19. 17:47


XPath(XML Path Language)는 W3C의 표준으로 확장 생성 언어 문서의 구조를 통해 경로 위에 지정한 구문을 사용하여 항목을 배치하고 처리하는 방법을 기술하는 언어이다. XML 표현보다 더 쉽고 약어로 되어 있으며, XSL 변환(XSLT)과 XML 지시자 언어(XPointer)에 쓰이는 언어이다. XPath는 XML 문서의 노드를 정의하기 위하여 경로식을 사용하며, 수학 함수와 기타 확장 가능한 표현들이 있다.

[편집]

XML 예제 문서

<?xml version="1.0" encoding="utf-8"?>
<wikimedia>
  <projects>
    <project name="Wikipedia" launch="2001-01-05">
      <editions>
        <edition language="English">en.wikipedia.org</edition>
        <edition language="German">de.wikipedia.org</edition>
        <edition language="French">fr.wikipedia.org</edition>
        <edition language="Polish">pl.wikipedia.org</edition>
      </editions>
    </project>
    <project name="Wiktionary" launch="2002-12-12">
      <editions>
        <edition language="English">en.wiktionary.org</edition>
        <edition language="French">fr.wiktionary.org</edition>
        <edition language="Vietnamese">vi.wiktionary.org</edition>
        <edition language="Turkish">tr.wiktionary.org</edition>
      </editions>
    </project>
  </projects>
</wikimedia>

아래의 XPath 식은

/wikimedia/projects/project/@name

모든 project 요소의 name 속성을 선택하고, 아래의 XPath 식은

/wikimedia/projects/project/editions/edition[@language="English"]/text()

모든 영문 Wikimedia 프로젝트의 주소(language 속성이 English인 모든 edition 요소의 문자열)를 선택하고, 아래의 XPath 식은

/wikimedia/projects/project[@name="Wikipedia"]/editions/edition/text()

모든 위키백과의 주소(Wikipedia의 이름 특성을 가진 project 요소 아래에 존재하는 모든 edition 요소의 문자열)를 선택한다.

[편집]바깥 고리






XML 문서에 XPath 식을 적용한 이미지


XML Path Language ( XPath ; XML 경로 언어)는 마크 업 언어 XML 기반의 문서의 특정 부분을 지정하는 언어 구문이다. XPath 자체는 간결한 구문 (표현 언어)이며, XML 기반의 마크 업 언어가 아니다. 표준화 단체 W3C (World Wide Web Consortium)에서 개발되어 1999 년 11 월 16 일 XML Path Language (XPath) 1.0 XSL Transformations(XSLT) 1.0 동시에 권고안으로 공표 된 [1] [2] . XPath는 XSLT와 XSL-FO 함께 스타일 시트 기술 XSL 의 구성 요소로 자리 매김하고있다. 2007 년 1 월 23 일, W3C에서 XPath 1.0의 차기 버전이 제정되어 XPath 2.0 이 XSLT 2.0 동시에 권고했다. 또한 W3C는 XPath 2.0을 확장 한 기술로 XQuery 1.0을 개발하고 2007 년 1 월 23 일 XPath 2.0 / XSLT 2.0 권고안과 동시에 XQuery 1.0 권고했다.

XPath 1.0가 발표되면 XML 문서에 대한 간단한 쿼리 언어 로 빠르게 XML을 다루는 소프트웨어 개발자 ( 프로그래머 )에게 받아 갔다. 원래는 XPath의 개발은 XSL ( XSLT )와 XPointer 에 공통되는 구문과 행동 모델을 개발하는 것을 목표로하고 있었다. 실제로 XSLT는 XML 문서의 특정 부분을 지정하는 패턴을 XPath를 기반으로 구문으로 지정한다. 일반적으로 XSLT 처리 계의 구현 은 XPath 처리 계의 구현을 포함한다.

XPath 1.0은 2007 년에 번역 된 JIS X 4160으로 JIS 규격 화되어있다.

목차

  [ 숨기기 ] 

데이터 모델 편집 ]

XPath의 데이터 모델 은 XML 문서는 루트 노드를 정점으로하는 노드의 트리 구조 로 다음의 7 종류의 노드로 구성된 (참고 : XML ).

  • 루트 노드
  • 요소 노드
  • 텍스트 노드
  • 속성 노드
  • 네임 스페이스 노드
  • 처리 명령 노드
  • 코멘트 노드

위치 경로 편집 ]

XPath에서 가장 일반적인 식은 위치 경로이다. 위치 경로는 XML 문서의 노드 (현재 컨텍스트 노드)를 기준으로 다른 노드 또는 여러 노드 (노드 집합)이 지정된 (지정되는 노드가 0 개 또는 1 개도없는 경우도 있다).

위치 경로는 하나 이상의 위치 단계의 순서로 기술된다. 여러 위치 단계에서 위치 경로를 설명하는 경우, 각 위치 단계는 / 로 분리된다.

위치 단계 편집 ]

위치 경로를 구성하는 각 위치 단계는 다음 세 가지 요소로 구성된다.

위치 단계는 다음의 두 가지 구문을 사용하여 설명 할 수있다.

  • 하나는 # 생략 구문 이며, 간결하고 XPath 식을 읽기 쉽게 쓰고 쉽게 작성할 수있다. 직관적이고 많은 경우 친근한 캐릭터 라인과 구문 설명한다.
  • 다른 하나는 생략하지 # 전체 구문 이며, 생략 구문에 비해 기술이 중복이지만, 생략 구문 더 많은 옵션을 지정할 수 있으며 XPath 식을주의 깊게 읽을 때 생략 구문보다 설명으로 설명하는 것이 XPath 식의 정확한 이해에 도움이된다.

생략 구문 편집 ]

생략 구문은 간단한 구문이며, 자주 사용되는 많은 기본값을 사용 생략 위치 단계를 설명 할 수있다.

생략 구문을 사용하여 간단한 위치 경로에 대한 예를 나타낸다.

  • / A / B / C

이 예에서는 선두가 / 이다 절대 경로이며, 0 개 또는 1 개 또는 복수의 C 요소를 선택한다. 선택된 C 요소는 B 요소의 자식 요소 (child element)이며, 그 B 요소는 A 요소의 자식이며, A 요소는 XML 문서의 루트 요소이다.

XPath 구문은 URI (Uniform Resource Identifier) ​​구문이나 파일 경로 구문을 모방하여 설계되어있다.

생략 구문은 앞의 예보다 복잡한 식을 작성할 수있다. 그러나 전체 구문과 비교하면 기술 능력은 제한된다.

  • 기본 child 축 이외에도 몇 가지  ( attribute 축, descendant-or-self 축, self 축, parent 축)을 지정할 수있다.
  • 간명 노드 이름의 지정 이외의 노드 테스트 를 지정 할 수있다.
  • 어떤 위치 단계에 대괄호 [과]을 뒤에 붙여 조건 을 지정할 수있다.

조금 복잡한 위치 경로의 예를 나타낸다.

  • A / / B / * [1]

이 예는, 선두가 / 이없는 상대 경로이며 모든 이름 ( * ) 첫 번째 요소 ( [1] )을 선택한다. 선택된 "첫 번째 요소"는 B 요소의 자식 요소 ( / )이며, 그 B 요소는 A 요소의 직간접적인 자식 요소 (하위 요소, / / )이며, 그 A 요소는 현재 문맥 노드의 자식이다.

생략 구문 목록과 공식적인 정의는 후 # 전체 구문과 생략 구문의 대응 관계 의 절의.

전체 구문 편집 ]

전체 구문의 일반 식은 다음 형태가된다

  • / 축 :: 네임 스페이스 : 노드 테스트 [조건] / ~ ~

대상 # 생략 구문 절에 나와있는 두 가지 예를 생략하지 않는 완전한 구문으로 다시 작성하면 다음과 같다.

  • / child :: A / child :: B / child :: C
  • child :: A / descendant-or-self :: node () / child :: B / child :: * [1]

이렇게 전체 구문 설명 된 위치 경로의 각 위치 단계에서는

  •  를 child 나 descendant-or-self 과 같이 명시 적으로 지정한다.
  • 축 지정에 이어 :: 을 설명하고, 노드 테스트 를 A 와 node () , * 과 같이 기술한다.
  • 생략 구문과 마찬가지로 노드 테스트 지정 뒤에 대괄호 [과]을 뒤에 붙여 조건 을 지정할 수있다.

축 편집 ]

위치 단계 의 축 (axis)의 설명은 XML 문서의 트리 에서 방향을 지정한다. XPath 사양에서 정의 된 13 개의 축 ( # 전체 구문 )을 나타낸다.

child
컨텍스트 노드의 자식 노드
descendant
컨텍스트 노드의 하위 노드
parent
문맥 노드의 부모 노드
ancestor
문맥 노드의 조상 노드
following-sibling
컨텍스트 노드의 형제 노드 중 후방의 노드
preceding-sibling
컨텍스트 노드의 형제 노드 중 전방 노드
following
XML 문서의 문서 순서에서 컨텍스트 노드보다 뒤에있는 모든 노드
preceding
XML 문서의 문서 순서에서 컨텍스트 노드보다 전방에있는 모든 노드
attribute
컨텍스트 노드가 요소의 경우, 그 속성 노드
namespace
컨텍스트 노드가 요소의 경우 네임 스페이스 노드
self
컨텍스트 노드 자신
descendant-or-self
컨텍스트 노드 자신과 컨텍스트 노드의 하위 노드
ancestor-or-self
컨텍스트 노드 자신과 문맥 노드의 조상 노드

생략 구문 에서 attribute 축을 사용 예를 보여준다.

  • / / a / @ href

이 예제에서는 href 속성 노드 집합을 선택한다. 선택된 href 속성 노드는 XML 문서 중 하나 a 요소 노드에 속해있다.

self 축은 뒷부분 조건 에서 그 술어의 바로 앞에있는 노드 테스트에서 선택된 노드를 설명하는 데 사용된다. 예를 나타낸다.

  • h3 [. = '관련 항목']

이 예제에서는 현재 노드의 자식 노드이자 내용의 텍스트 '관련 항목' 을 가진 h3 요소가 선택된다.

노드 테스트 편집 ]

위치 단계 노드 테스트 (node ​​test) 식 또는 특정 노드 이름으로 설명된다. 예를 들어, 네임 스페이스 접두사 gs 가 정의 된 XML 문서에서 / / gs : enquiry 과 노드 테스트가 작성된 경우, gs 네임 스페이스 아래 enquiry 를 노드 이름으로하는 모든 노드의 집합이이 노드 테스트 지정의 대상이된다.

노드 테스트 형식을 나타내는 [3] .

이름
"네임 스페이스 접두사 : 이름"이라는 형식으로도 좋고, attribute 축과 namespace 축 이외의 축 경우 해당 이름을 가진 모든 요소 노드를 지정한다. attribute 축의 경우는 그 이름의 모든 속성 노드를 지정하고 namespace 축의 경우 네임 스페이스 노드를 지정한다.
text ()
모든 텍스트 (문자열) 노드를 지정한다. 예 : <k> 안녕하세요 </ k> 중 '안녕'
comment ()
모든 XML 주석 노드를 지정한다. 예 : <! - 댓글 ->
processing-instruction ()
모든 XML 처리 명령 노드를 지정한다. 예 : <? xsl-stylesheet href = "article.css"?> processing-instruction (처리 명령 대상)이라는 형식으로 작성도 가능하며,이 경우는 processing-instruction ( 'xsl-stylesheet') 와 작성 및 지정 대상이된다.
node ()
모든 노드를 지정한다.
*
기본 노드 형식의 모든 노드를 지정한다. 여기에서 기본 노드 형식은 attribute 축과 namespace 축 이외의 축 경우는 요소 노드를 의미하고 attribute 축의 경우는 속성 노드를 namespace 축의 경우 네임 스페이스 노드를 각각 의미한다.
네임 스페이스 접두사 : *
네임 스페이스 접두사가 나타내는 네임 스페이스에 속하는 모든 기본 노드 형식의 노드를 지정한다.

전체 구문과 생략 구문의 대응 관계 편집 ]

위치 단계 의 # 전체 구문 과 # 생략 구문 의 대응 관계를 다음 [1] [4] .

전체 구문생략 구문설명
child ::(생략 아무것도 쓰지 않는다)컨텍스트 노드의 자식 노드
attribute ::@컨텍스트 노드가 요소의 경우, 그 속성 노드
/ descendant-or-self :: node () // /컨텍스트 노드 자신과 컨텍스트 노드의 하위 노드
self :: node ().컨텍스트 노드 자신
parent :: node ()..문맥 노드의 부모 노드

조건 편집 ]

위치 단계 는 노드 테스트 뒤에 괄호로 묶을 술어 (predicate) 복잡한 식을 작성하여 노드 테스트에서 지정된 노드 집합을 제한 할 수있다. 노드 집합을 좁힐 필요가없는 경우, 조건은 기술하지 않는다.

간단한 예를 나타낸다.

  • / / a [@ href = 'help.php']

이 예에서는 [@ href = 'help.php'] 부분이 조건이다. 이 XPath 식은 href 속성을 가지고 있고 그 속성 값이 'help.php' 인 모든 a 요소 노드를 지정한다.

앞의 예에서는 술어의 수는 1 개 였지만, 위치 경로를 구성하는 위치 단계마다 여러 조건을 지정할 수있다. 즉, 검색 조건을 여러 거듭해 지정할 수있다. 지정할 수있는 조건의 수에는 제한이 없다.

술어는 그 술어를 포함 위치 단계의 컨텍스트를 변경할 수는 없다. 그 직전의 노드 테스트에서 지정된 노드 집합이 그 위치 단계의 문맥이며, 조건이 지정 됨으로써 컨텍스트가 변경 될 수는 없다.

복잡한 예를 나타낸다.

  • / / a [@ href = 'help.php'] [name (..) = 'div'] [.. / @ class = 'header'] / @ target

이 예는 a 요소의 target 속성 값을 지정한다. 그러나이 XPath 식의 첫 번째 위치 단계에는 3 개의 조건이 기술되어 있으며, a 요소 중

  • a 요소의 href 속성 값이 'help.php' 이며,
  • 한편, a 요소의 부모 요소 요소 이름이 div 이며,
  • 한편, 부모 요소 ( div )의 class 속성의 값이 'header' 이다,

a 요소 만 먼저 위치 단계의 지정 대상이된다. 결국 첫 번째 위치 단계에서 좁혀지고 지정 대상이 된 a 요소의 target 속성이 지정된다.

데이터 형식과 연산자, 함수 편집 ]

XPath 1.0에서 규정 된 형식 과 연산자 , 함수 를 설명한다.

데이터 형식은 다음 4 가지가 정의되어있다.

  • 노드 집합 (node​​-set; 정렬되지 않은 노드 집합)
  • 문자열 (string)
  • 숫자 (number; 부동 소수점 )
  • 논리 형 (boolean)

연산자는 다음과 같습니다.

  • "/"연산자 "/ /"연산자 (전제)
  • "|"연산자 : 두 노드 집합의 합집합 노드 집합을 반환
  • 논리 연산자 : "and" "or"- 논리 값을 반환
  • 산술 연산자 : "+" "-" "*" "div"( IEEE 754 기반 나눗셈) "mod"(나머지) - 숫자 (부동 소수점)을 반환
  • 비교 연산자 : "=", "! =", "<", ">", "<=", "> ="- 논리 값을 반환

함수에는 다음과 같은 것이있다.

  • 문자열 처리 함수 : concat (), substring (), contains (), starts-with () ends-with (), substring-before (), substring-after (), translate (), normalize-space ( ), string-length ()
  • 숫자를 다루는 함수 : sum (), round (), floor (), ceiling ()
  • 노드의 정보를 가져 오는 함수 : name () local-name (), namespace-uri ()
  • 처리의 컨텍스트에 대한 정보를 가져 오는 함수 : position (), last ()
  • 형식을 변환하는 함수 : string () number () boolean ()

비교적 자주 사용되는 함수는 다음 절 이후에 조금 선발한다. 완전한 정의는 W3C의 권고안 (일본어 번역) 를 참조하십시오.

XPath 식에서는 괄호 (와)로 묶어 그룹화하고 평가 순서를 명시 할 수있다.

술어 는 연산자를 사용한 식을 포함 할 수있다. 논리 식 (논리 값을 반환하는 식)은 and 연산자 및 or 연산자으로 연결하거나, not () 함수의 인수 할 수있다. 문자열 (string)에는 Unicode 문자를 포함 할 수있다. 조건 연산자를 사용 예를 보여준다.

  • / / item [@ price> = 2 * @ discount]

이 예제에서는 price 속성의 수치가 discount 특성 숫자의 2 배 이상이다 item 요소의 집합을 선택한다.

연산자 |는 술어 내부에서도 조건 외부에서도 노드 집합의 합을 구하기 위해 사용할 수있다. 술어 외부에서 | 연산자를 사용 예를 보여준다.

  • v [x or y] | w [z]

이 예에서는 하나의 노드 집합을 반환. 반환되는 노드 집합은 처리중인 컨텍스트에서 자식으로 x 요소 또는 y 요소를 갖는 v 요소의 집합와 자식으로 z 요소를 가진 w 요소의 집합의 합집합이다.

노드 집합 함수 편집 ]

Number position ()
평가의 문맥 노드의 위치를​​ 숫자로 반환 (형제 노드의 위치).
Number Count ( node-set )
인수 노드 집합 (또는 노드 집합을 반환하는 식)의 노드 수를 반환.
node-SET ID ( object )
인수 개체의 문자열 값을 ID 형식의 특성 값으로 갖는 노드 집합을 반환.
String name ( node-set? )
인수로 전달 된 노드 집합의 첫 번째 노드의 이름을 반환 (노드가 요소의 경우 요소 이름, 속성의 경우 속성 이름).

문자열 함수 편집 ]

String String ( object? )
XPath에 규정 된 4 가지 데이터 형식 을 인수로 취할 수 사양으로 정해진 변환 규칙에 따라 문자열로 변환한다. 인수로 XPath 식을 전달할 수있다.
Number String-length ( string? )
인수로 전달 된 문자열의 길이 (문자 수)를 돌려 준다.
String substring ( string, number, number? )
인수로 전달 된 문자열의 부분 문자열을 반환.
String concat ( string, string, string * )
인수로 전달 여러 문자열을 연결하여 돌려 준다.
boolean Contains ( string1, string2 )
인수의 문자열 string1 문자열 string2 가 포함 된 경우 true를 반환. 포함되지 않은 경우는 false를 돌려 준다.
String normalize-space ( string? )
인수의 문자열을 정상화 해 돌려 준다. 즉, 문자열의 앞뒤 공백을 제거하고, 제거 된 문자열에 연속 나타나는 공백을 하나의 공백으로 교체 한 문자열을 돌려 준다.

논리 함수 편집 ]

boolean not ( boolean )
인수 논리 값의 반대 값을 돌려 준다.

숫자 함수 편집 ]

Number sum ( node-set )
인수로 전달 된 노드 집합의 각 노드의 문자열 값을 사양으로 정해진 변환 규칙에 따라 숫자로 변환하여 합계 한 값을 돌려 준다.

예 편집 ]

다음 XML 문서에서 XPath를 예시하고 설명한다.

<? XML  version = "1.0"  encoding = "utf-8" ?> 
<document >
     <! - XML 문서 -> 
    <chapter  title = "제 1 장" > 
        <paragraph > 단락 </ paragraph >
         <paragraph > 다음 단락 </ paragraph >
         <paragraph > 또한 다음 단락 </ paragraph >
         <paragraph > 마지막 단락 </ paragraph >
     </ chapter >
     <chapter  title = "제 2 장" > 
        <paragraph > 단락 </ paragraph >
     </ chapter >
 </ document >
  • / document  : 루트 요소 document 를 선택한다.
  • / *  : 이름을 한정하지 않고 루트 요소를 선택한다. 이 경우 같은 document 가 선택된다 (XML 문서는 반드시 하나의 루트 요소를 갖는)
  • / document / chapter  : document 요소의 자식 인 모든 chapter 요소를 선택한다.
  • / document / chapter [1]  : document 요소의 자식 요소 중 첫 번째 chapter 요소를 선택한다.
  • / / paragraph  : 문서의 모든 paragraph 요소를 선택한다.
  • / / chapter [@ title = "제 1 장"] / paragraph  : title 속성의 값이 "제 1 장"이다 chapter 요소의 자식 인 모든 paragraph 요소를 선택한다.

XPath 2.0 편집 ]

서두에서 언급 한 바와 같이, XPath의 2007 년 3 월 현재의 최신 버전 XPath 2.0은 2007 년 1 월 23 일에 표준화 단체 W3C 에서 권고되었다. 또한 XPath 1.0은 1999 년 11 월 16 일 권고했다. XQuery 1.0 (권고 후보)는 XPath 2.0의 확장이다. 또한 XPath 2.0 XSLT 2.0에서도 채용되고있다.

XPath 2.0 사양은 1.0에 비해 대규모로되어 매우 많은 기능이 규정되어있다. 그 중 특히 중요한 변화는 다양한 데이터 형식 을 취급 할 수있게 된 것이다. XPath 2.0 스키마 언어 XML Schema 에서 규정 된 내장 원자 데이터 형식 및 스키마에 정의 된 사용자 정의 형식을 처리 할 수있다. 모든 값은 시퀀스로 취급된다. 하나의 문자열 값과 노드는 시퀀스에있는 요소 중 하나라고 평가된다. XPath 1.0 노드 집합은 XPath 2.0 어떠한 순서를 갖는 순서로 대체. 다양한 형식을 처리하기 위해 XPath 2.0 함수 및 연산자 가 크게 확장된다.

XPath 2.0은 XQuery 1.0의 부분 집합이다. XPath 2.0은 XQuery 1.0 구문의 경로 식을 구성한다. XQuery 1.0 FLWOR라는 식에서는 for 절 구성 요소가된다.

구현 편집 ]

Java 편집 ]

javax.xml.xpath [5] 패키지가, XPath 1.0 구현되어있다. XPathFactory.newInstance (). newXPath () 에서, XPath의 인스턴스를 만들 수,XPath.evaluate () 에서 XPath를 평가할 수있다.

JavaScript 편집 ]

HTML이 아닌 일반 XML 관해서는 XMLHttpRequest 를 사용하면 DOM 나무를 만들 수 있으며, 모두에 대해 XPath 사용할 수있다. Internet Explorer 의 경우,XMLDomNode.selectNodes () [6] 에서 XPath를 사용할 수있다. Internet Explorer 이외의 브라우저에서는, DOM Level 3 XPath 사양대로XPathEvaluator.evaluate () [7] 에서, XPath를 취급.

현재 브라우저 표준 XPath를 사용할 수 있지만, 2007 년 정도까지는, JavaScript에서 구현 한 XPath가 만들어져 있고, JavaScript-XPath [8] 과 Google AJAXSLT [9] 등이 XPath를 구현하고있다.

관련 항목 편집 ]

각주 편집 ]

도움말 ]
  1. b XPath 1.0 사양 (영어) - W3C (World Wide Web Consortium)
  2. ^ W3C의 XPath 1.0 작업 부회는 제임스 클라크 와 스티븐 디로즈가 공동으로 편집기를 맡았다. 또한 XSLT 1.0 작업 부회는 제임스 클라크 편집기를 맡았다.
  3. ^ (주) 일본 유니텍 외에 2001 년, p.66
  4. ^ (주) 일본 유니텍 외에 2001 년, p.67
  5. javax.xml.xpath (Java Platform SE 6)
  6. selectNodes Method
  7. evaluate - Document Object Model XPath
  8. JavaScript-XPath
  9. Google AJAXSLT







XQuery 는 정적 타이핑 기능 (구현 의존의 기능)와 XML 데이터 질의에 대한 쿼리 언어 이며, 튜링 완전 하게 기능적인 언어 이기도하다. XPath 의 목적이 나무의 절점을 가리키는 (주소)이다 반면 XQuery의 목적은 XML 데이터 소스에 대한 조회 기능을 제공하기위한 것이다.

관계 모델 ( 관계 데이터베이스 )의 관계 문의가 수학적 배경이있다 관계 대수 연산없고 관계 논리 연산에 따라 같이 XQuery 질의는 형식 의미론 을 부여하고있다.

XQuery는 Quilt 라는 언어를 기반으로 설계되어 있지만, 그 밖에도 XPath 1.0, SQL , XQL, OQL , XML-QL, ML 과 같은 언어의 영향을 받고있다. 2007 년 1 월 23 일 W3C 에서 표준화 작업이 종료 권고 ( Recommendation )이되었다.

목차

  [ 숨기기 ] 

XPath 1.0과 XQuery 1.0 (XPath 2.0) 편집 ]

XQuery 1.0은 XPath 2.0의 확장이다. XPath 2.0은 XQuery 1.0에서도 구문으로 정확하고 제대로 실행되는 식은 어느 언어에서도 같은 결과를 돌려 준다. 한편, XPath 1.0과 XQuery의 하위 집합 XPath 2.0은 기본적 성질에 차이가있다. XPath 1.0 질의 결과를 고유 한 노드 집합으로 정의되는 반면, XPath 2.0에서 질의 결과는 순서를 가지고 중복 값을 허용 시퀀스이다. 그러나 XPath 2.0은 XPath 1.0에 대한 호환성 모드가 옵션으로 존재하고이 옵션을 사용할 수있는 환경에서는 XPath 2.0은 XPath 1.0과 동일한 결과를 얻을 수있다.

관련 항목 편집 ]

외부 링크 편집 ]

관련 리소스 편집 ]






http://stackoverflow.com/questions/1006283/xpath-select-first-element-with-a-specific-attribute 


이번에 플젝을 하면서 xml을 읽어서 처리 할 부분이 있었습니다.
jdom을 사용했었는데, dom4j라는 것을 알게 되어서 한번 사용을 해보려고 합니다.
일단 간단한 사용 방법을 익히기 위해서 이것저것 해보겠습니다.

dom4j는 xpath의 사용이 예전 jdom에 비해서 많이 편해졌습니다.

일단 xpath의 간단한 가이드를 먼저 알아보겠습니다.

1. "/AAA"
root Element를 선택합니다.

<AAA>
 <BBB><BBB/>
 <CCC><CCC/>
 <DDD>
    <BBB/>
  <DDD/>
</AAA>

2. "/AAA/CCC"
root element AAA의 자식element 중 CCC를 모두 선택합니다.

     <AAA
          <BBB/> 
          <CCC/> 
          <BBB/> 
          <BBB/> 
          <DDD
               <BBB/> 
          </DDD
          <CCC/> 
     </AAA

3. "/AAA/DDD/BBB"
    root Element AAA의 자식element인 DDD의 자식element인 BBB를 모두 선택합니다.
 
    <AAA
          <BBB/> 
          <CCC/> 
          <BBB/> 
          <BBB/> 
          <DDD
               <BBB/> 
          </DDD
          <CCC/> 
     </AAA

4."//BBB"

element BBB를 모두 선택합니다.
     <AAA
          <BBB/> 
          <CCC/> 
          <BBB/> 
          <DDD
               <BBB/> 
          </DDD
          <CCC
               <DDD
                    <BBB/> 
                <BBB/> 
               </DDD
          </CCC
     </AAA

5."//DDD/BBB"
DDD의 자식element인 BBB를 모두 선택합니다.

    <AAA
          <BBB/> 
          <CCC/> 
          <BBB/> 
          <DDD
               <BBB/> 
          </DDD
          <CCC
               <DDD
                    <BBB/> 
                    <BBB/> 
               </DDD
          </CCC
     </AAA

더 자세한 내용은

http://www.zvon.org/xxl/XPathTutorial/Output/example1.html

이곳을 참조하세요.


출처 - http://devyongsik.tistory.com/172






3. XPath


3.1 XPath란 무엇인가 ?


 XPath is XML 문서의 부분을 정의하기 위한 W3C의 표준 문법 규약으로  XML 엘러먼트를 정의하기 위하여 path(경로)를 사용한다. XPath 는 표준함수의 라이브러리를 제공하며 XSLT의 주요 부분이나 XML로 쓰여지지 않았다. 즉, XPath는 XML 문서의 부분을 정의하기 위한 문법 규약(syntax rule) 의 집합으로써 XPath에 대한 지식이 없이는 XSLT 문서를 생성할  수 없다.  XPath는 XML 문서의 노드를 정의하기 위하여 경로식(path expression)을 사용하며 이러한 경로들은 우리가 파일 시스템에서 사용하였던 표현과 아주 유사하다. 


temp/xpath/sample.jsp

XPath 예

아래의 XML 문서를 보도록 하자.

<?xml version="1.0" encoding="EUC-KR"?>

<catalog>

<cd>

<title>San DoKaebi</title>

<artist>기둥SeulKiDoong</artist>

<country>Korea</country>

<company>Dongeui</company>

<price>8000</price>

<year>1992</year>

</cd>


<cd>

<title>Say Yes</title>

<artist>Chake&Aska</artist>

<country>Japan</country>

<company>Sony 레코드</company>

<price>12000</price>

<year>1992</year>

</cd>

<cd>

<title>Hound dog</title>

<artist>Elvis Presley</artist>

<country>USA</country>

<company>RCA</company>

<price>9000</price>

<year>1972</year>

</cd>

<cd>

<title>Still got the blues</title>

<artist>Gary Moore</artist>

<country>UK</country>

<company>Virgin records</company>

<price>10.20</price>

<year>1990</year>

</cd>

<cd>

<title>Romanza</title>

<artist>Andrea Bocelli</artist>

<country>EU</country>

<company>Polydor</company>

<price>15000</price>

<year>1996</year>

</cd>

<cd>

<title>When a man loves a woman</title>

<artist>Percy Sledge</artist>

<country>USA</country>

<company>Atlantic</company>

<price>8000</price>

<year>1987</year>

</cd>

<cd>

<title>Pavarotti Gala Concert</title>

<artist>Luciano Pavarotti</artist>

<country>UK</country>

<company>DECCA</company>

<price>13000</price>

<year>1991</year>

</cd>

 <cd>

<title>Unchain my heart</title>

<artist>Joe Cocker</artist>

<country>USA</country>

<company>EMI</company>

<price>10000</price>

<year>1987</year>

</cd>

</catalog>



아래의 XPath 식(expression)은 루트 엘러먼트인  catalog를 선정한다.

/catalog 

아래의 XPath 식은 catalog 엘러먼트 밑의 cd 엘러먼트를 선정한다.

/catalog/cd


아래의 XPath 식은 catalog 엘러먼트 밑의 cd 엘러먼트의 모든 price 엘러먼트를 선정한다.

/catalog/cd/price


Note: 경로가 /로 시작한다면 엘러먼트에 대한 절대 경로를 의미한다. 


3.2 XPath 의 구문


 XPath 는 문자열(string), 수(number), 불리언 표현을 취급하기 위한 표준함수의 라이브러리를 정의한다.  예를 들면 아래의 XPath 식은 price 엘러먼트의 값으로 10000원 이상의 값을 가지는 모든 cd 엘러먼트를 선정한다.  


/catalog/cd[price>10000]


XPath 는 XSLT 표준의 주요 부분으로 XSLT를 공부하려면 앞에서 설명한 바있다. 서두에도 이야기 하였듯이 XPath 는 1999년 10월 16일 XML 문서의 어드레싱 부분을 취급하는 언어로써 W3C 권고안으로 탄생하였으며 XSLT, XPointer 및 다른 파싱 소프트웨어에 의해 사용된다.


XPath 는 경로식(path expression)을 사용하여 XML 문서내의 노드를 찾는데 사용된다.

아래와 같은 XML 예제 문서를 보도록 하자.


<?xml version="1.0" encoding="EUC-KR"?>

<catalog>

<cd>

<title>San DoKaebi</title>

<artist>기둥SeulKiDoong</artist>

<country>Korea</country>

<company>Dongeui</company>

<price>8000</price>

<year>1992</year>

</cd>

<cd>

<title>Say Yes</title>

<artist>Chake&Aska</artist>

<country>Japan</country>

<company>Sony 레코드</company>

<price>12000</price>

<year>1992</year>

</cd>

<cd>

<title>Hound dog</title>

<artist>Elvis Presley</artist>

<country>USA</country>

<company>RCA</company>

<price>9000</price>

<year>1972</year>

</cd>

<cd>

<title>Still got the blues</title>

<artist>Gary Moore</artist>

<country>UK</country>

<company>Virgin records</company>

<price>10.20</price>

<year>1990</year>

</cd>

<cd>

<title>Romanza</title>

<artist>Andrea Bocelli</artist>

<country>EU</country>

<company>Polydor</company>

<price>15000</price>

<year>1996</year>

</cd>

<cd>

<title>When a man loves a woman</title>

<artist>Percy Sledge</artist>

<country>USA</country>

<company>Atlantic</company>

<price>8000</price>

<year>1987</year>

</cd>

<cd>

<title>Pavarotti Gala Concert</title>

<artist>Luciano Pavarotti</artist>

<country>UK</country>

<company>DECCA</company>

<price>13000</price>

<year>1991</year>

</cd>

 <cd>

<title>Unchain my heart</title>

<artist>Joe Cocker</artist>

<country>USA</country>

<company>EMI</company>

<price>10000</price>

<year>1987</year>

</cd>

</catalog>


1) 노드 찾기


 XML 문서는 우리가 컴퓨터의 폴더 구조에서 보는 것처럼 트리 구조로 표현된다.  XPath는 XML 문서 속에서 노드를 찾기 위해 패턴식(pattern expression)을 사용하며 XPath의 패턴은  /로 분리된 자식 엘러먼트의 이름들의 리스트로써 XML 문서에서의 경로를 표현하며  패턴은 경로에 매칭되는 엘러먼트를 선택한다.


아래의 XPath식은 catalog 엘러먼트의 모든 cd 엘러먼트의 price 엘러먼트를 선택한다.


/catalog/cd/price 


Note: /로 시작하는 경로는 엘러먼트에 대한 절대 경로를 나타낸다.


경로가  // 로 시작하면 경로에 관계없이 문서 속의 모든 엘러먼트에 대하여 주어진 기준(criteria)을 만족하는 엘러먼트를 선택한다.


아래의 XPath 경로는 문서 숙의 모든 cd 엘러먼트를 선택한다.


//cd 


알려지지 않은 엘러먼트 선택하기



와일드 카드(*) 는 알려지지 않은 엘러먼트를 선택하기 위해 사용된다.  아래의 XPath 식은 catalog 엘러먼트의 cd 엘러먼트의 모든 자식 노드를 선택하기 위해 사용된다. 


/catalog/cd/*


다음의 XPath 식은 catalog 엘러먼트의 손자 엘러먼트인 모든 price 엘러먼트를 선택한다.


/catalog/*/price 


아래의 XPath 식은 2 레벨의 조상 엘러먼트를 가진 모든 price 엘러먼트를 선택한다.


/*/*/price 


아래의 XPath 식은 경로에 관계없이 문서 속의 엘러먼트를 선택한다.


//*



2) 보다 자세하게 엘러먼트 선정하기


XPath 속의 대괄호[]를 이용하여 선택하고자 하는 엘러먼트를 보다 세밀하게 표현할 수 있다.


아래의 XPath 표현은 catalog 엘러먼트의 첫 번째 cd 자식을 선택한다.


/catalog/cd[1] 


아래의 XPath 표현은 catalog 엘러먼트의 마지막 cd 자식을 선택한다(그러나 first()라는 함수는 존재하지 않는다).


/catalog/cd[last()] 


아래의 XPath 표현은 price 엘러먼트를 가진 catalog 엘러먼트의 모든 cd 엘러먼트를 선택한다.


/catalog/cd[price] 


아래의 XPath 표현은 price 엘러먼트의 값으로 9000을 가진 catalog 엘러먼트의 모든 cd 엘러먼트를 선택한다.


/catalog/cd[price=9000] 


아래의 XPath 표현은 price 엘러먼트의 값으로 9000을 가진 catalog 엘러먼트의 cd 엘러먼트의 모든 price 엘러먼트를 선택한다.


/catalog/cd[price=90000]/price



3) 여러 path를 선택하기


 | 연산자를 사용하며 여러 경로를 선택할 수 있다. 다음의 XPath 식은 catalog 엘러먼트의 cd 엘러먼트의 모든 title과 artist 엘러먼트를 선택한다.


/catalog/cd/title | /catalog/cd/artist


다음의 XPath 식은 문서 속에 있는 모든 title과 artist 엘러먼트를 선택한다.


//title | //artist


다음의 XPath 식은 문서 속에 있는 모든 title, artist, price 엘러먼트를 선택한다.


//title | //artist | //price


다음의 XPath 식은 문서 속에 있는 모든 artist 엘러먼트와 catalog 엘러먼트의 cd 엘러먼트의 모든 title 엘러먼트를 선택한다.


/catalog/cd/title | //artist


3.3 속성 선정하기


XPath에서는 모든 속성이 @로 명시되며  아래의 예는 country라는 이름을 가진 속성을 선택한다.


//@country


아래의 XPath 식은 country라는 속성을 가진 모든 cd 엘러먼트를 선택한다.


//cd[@country]



아래의 XPath 식은 어떠한 속성이라도 속성이 존재하는 cd 엘러먼트를 선택한다.


//cd[@*]


아래의 XPath 식은 속성 country의 값으로 UK를 가지는 모든 cd 엘러먼트를 선택한다.


//cd[@country='UK']


3.4 XPath의  위치 경로



1) 위치 경로 식(Location Path Expression)


위치 경로는 절대 또는 상대 경로 둘 중 하나이다. 절대 경로는 /로 시작하며 상대 위치 경로는 그렇지 않다.  그러나 두 방식 다 /로 구분된 하나 또는 그 이상의 위치 단계로 구성되어 있다.


An absolute location path:

/step/step/...

A relative location path:

step/step/...

위치 단계는 왼쪽에서 오른쪽으로 한번에 한 단계씩 체크한다. 즉, 각 단계에서 현재의 노드셋(node-set)에 속해 있는 각 노드를 대상으로 하여 체크한다. 만약 위치 경로가 절대 경로이면 현재의 노드셋은 루트 노드로 구성된다.  만약 위치 경로가 상대 경로이면 현재의 노드셋은 식에 사용된 노드로 구성된다.

위치 단계는 다음과 같은 요소로 구성된다.

축 : 위치 단계에 의해 선정된 노드와 현재 노드와의 트리 관계를 나타냄


노드 테스트 : 위치 단계에 의해 선정된 노드의 확장명과 노드 타입을 나타냄


0개 이상의 서술부 : 위치 단계에 의해 선정된 노드의 집합을 보다 상술하는 식



위치 단계의 문법은 다음과 같다.


axisname::nodetest[predicate]


예:


child::price[price=9.90]






2) 축과 노드 테스트(Axes and Node Tests)


축은 현재 노드와 관련 있는 노드 셋을 정의하고 노드 테스트는 축 안에 있는 노드를 정의 하며 노드에 대한 테스트를 이름 또는 유형으로 할 수 있다.



축 이름

Description

ancestor

현재 노드의 모든 조상 노드를 포함

Note: 이 축은 현재 노드가 루트인 경우를 제외하고는 항상 루트를 포함하고 있다.

ancestor-or-self

현재 노드와  현재 노드의 모든 조상 노드를 포함

attribute

현재 노드의 모든 속성을 포함

child

현재 노드의 모든 자식 노드를 포함

descendant

현재 노드의 모든 후손 노드를 포함

Note: 이 축은 이름 공간이나 속성은 포함하지 않는다.

descendant-or-self

현재 노드 및 현재노드의 후손 노드를 포함

following

현재 노드의 태그를 종료한 뒤에 있는 문서 속에 있는 모든 것을 포함

following-sibling

현재 노드의 모든 형제 노드를 포함

Note: 현재의 노드가 속성 노드 또는 이름 공간 노드라면 이 축은 비어있음

namespace

현재 노드의 모든 이름 공간 노드를 포함

parent

현재 노드의 부모 노드를 포함

preceding

문서 속에서 현재 노드의 시작 태그 앞에 존재하는 모든 것을 포함

preceding-sibling

현재 노드 앞의 모든 형제 노드를 포함

Note: 현재 노드가 속성 노드 또는 이름공간 노드일 경우 이 축은 비어있음

self

현재 노드를 포함



Example

Result

child::cd

현재노드의 자식 노드인 모든 cd 엘러먼트를 선택한다.(만약 현재 노드가 자식이 없으면 빈 노드셋을 선택한다)

attribute::src

현재 노드의 src 속성을 선택한다.(만약 현재 노드가 src 속성을 가지고 있지 않다면 빈 노드셋을 선택한다)

child::*

현재 노드의 모든 자식 엘러먼트를 선택한다

attribute::*

현재 노드의 모든 속성을 선택한다

child::text()

현재 노드의 택스트 노드 자식을 선택한다

child::node()

현재 노드의 모든 자식을 선택한다

descendant::cd

현재 노드의 모든 cd 엘러먼트 자손을 선택한다.

ancestor::cd

현재 노드의 모든 cd 조상들을 선택한다.

ancestor-or-self::cd

현재 노드의 모든 cd 조상들을 선택한다. 만약 현재 노드가 cd 엘러먼트이면 현재 노드도 포함한다

child::*/child::price

현재 노드의 모든 price 손자 노드를 선택한다

/

문서의 루트를 선택한다

3) 서술 부(Predicates)

서술부는 [] 속에 놓여지며 노드셋을 필터링하여 새로운 노드 셋을 만들어낸다.

결과

child::price[price=9000]

현재 노드의 모든 price 자식 엘러먼트중 값이 9000인 price 엘러먼트를 선택

child::cd[position()=1]

현재 노드의 첫 cd 엘러먼트를 선택

child::cd[position()=last()]

현재 노드의 마지막 cd 엘러먼트를 선택

child::cd[position()=last()-1]

현재 노드의 cd 자식 노드 중 마지막에서 두 번째 cd 자식 엘러먼트를 선택

child::cd[position()<6]

현재 노드의 첫 다섯 cd 자식 노드를 선택

/descendant::cd[position()=7]

문서 속의 7번째 cd 엘러먼트를 선택

child::cd[attribute::type="classic"]

현재 노드의 cd 엘러먼트 중 type 속성으로 classic이라는 값을 가지는 엘러먼트 선택

4) 위치 경로의 단축된 문법

경로 위치를 표현하기 위해 압축된 문법을 사용하며 가장 중요한 압축된 표현은 child:: 로써 위치 단계에서 생략될 수 있다.


약칭

의미

예제

없음

child::

 cd 는 child::cd의 줄인 표현

@

attribute::

 cd[@type="classic"]은 child::cd[attribute::type="classic"]의 줄인 표현

.

self::node()

 .//cd 는 self::node()/descendant-or-self::node()/child::cd 의 줄인 표현

..

parent::node()

 ../cd 는 parent::node()/child::cd 의 줄인 표현

//

/descendant-or-self::node()/

 //cd 는 /descendant-or-self::node()/child::cd 의 줄인 표현


결과

cd

현재 노드의 모든 자식 cd 엘러먼트를 선택

*

현재 노드의 모든 자식 엘러먼트를 선택

text()

현재 노드의 모든 텍스트 노드 자식을 선택

@src

현재 노드의 모든 src 속성을 선택

@*

현재 노드의 모든 속성을 선택

cd[1]

현재 노드의 첫 번째 자식을 선택

cd[last()]

현재 노드의 마지막 자식을 선택

*/cd

현재 노드의 모든 손자 노드를 선택

/book/chapter[3]/para[1]

book의 chapter[3]의 첫 para를 선택

//cd

문서의 루트의 모든 cd 자손들을 선택하고 나서 해당 문서를 현재 노드로 하여 모든 cd 엘러먼트를 선택

.

현재 노드 선택

.//cd

현재 노드의 cd 엘러먼트 자손들을 선택

..

현재 노드의 부모를 선택

../@src

현재 노드의 부모의 src 속성을 선택

cd[@type="classic"]

현재 노드의 모든 cd 자식 노드중 type 속성으로 classic을 갖는 자식을 선택

cd[@type="classic"][5]

현재 노드의 cd 자식 노드중 type 속성으로 classic을 갖는 자식중 5번째 자식을 선택

cd[5][@type="classic"]

현재 노드의 5번째 cd 자식 노드가 ype 속성으로 classic을 갖는 다면 선택

 

cd[@type and @country]

현재 노드의 모든 cd 자식 중 속성으로 type과 country를 가지는 자식을 선택

3.5 XPath 식


XPath 는 수치, 등식, 관계 및 불리언 연산을 지원한다.


1) 수치 표현식(Numerical Expressions)


수치 표현식은 수치에 대하여 산술연산을 시행하기 위하여 사용된다.


연산자

설명

예제

결과 

+

더하기

6 + 4

10

-

빼기

6 - 4

2

*

곱하기

6 * 4

24

div

나누기

8 div 4

2

mod

Modulus (나누기의 나머지)

5 mod 2

1

Note: XPath 는 산술 연산을 시행하기 전에 각 피연산자를 수치로 바꾼 다음 계산한다.

2) 등호 연산(Equality Expressions)

등호 연산은 두 값의 동일 여부를 테스트하기 위해 사용한다.


연산자

설명

예제

결과

=

 같음

price=9.80

참 (만약 price is 9000 이면)

!=

 같지 않음

price!=9.80

거짓

3) 노드 셋에 대한 테스트

만약 test value 가 노드 셋에 대한 등호 연산을 시행하였다면 만약 해당 노드 셋에 test value를 만족하는 값이 하나라도 있다면 결과는 참이 된다.

만약 test value가 노드 셋에 대하여 부등호 연산을 시행하였다면 만약 해당 노드셋에 test value를 만족하지 않는 것이 하나라도 있다면 결과는 거짓이 된다.

결론은 노드 셋이 동시에 참이 될 수 도 있고 거짓이 될 수 도 있다는 것이다.


4) 관계식(Relational Expressions)


관계식은 두 값을 비교하기 위해 사용된다.


연산자

설명

예제

결과

<

작음

price<8000

거짓(만약 price가 9000이면)

<=

작거나 같음

price<=9000

>

price>9000

거짓

>=

크거나 같음

price>=9000

Note: XPath 는 연산을 시행하기 전에 각 피연산자를 수치로 바꾼 다음 계산한다.

5) 불리언식(Boolean Expressions)

불리언 식은 두 값을 비교하기 위하여 사용된다.

연산자

설명

예제

결과

or

or

price=9000 or price=8000

참 (만약 price is 8000이면)

and

and 

price<=9000 and price>=8000

거짓e

6) XPath 함수

XPath 는 데이터 변환을 위한 함수 라이브러리를 포함하고 있다.


XPath 함수 라이브러리


XPath 함수 라이브러리는 데이터를 변환, 번역하기 위한 중요 함수를 포함하고 있다.


노드 셋 함수(Node Set Functions)


이름

설명

count()

선택된 엘러먼트의 수를 반환

id()

Selects 엘러먼트들을 그들 고유의 ID로 선택

last()

식 평가 컨텍스트(expression evaluation context)로부터 컨텍스트의 크기에 해당하는 수를 반환

local-name()

문서 순서에서 첫 번째인 인수 노드셋(argument node-set)의 노드의 확장명의 local part를 반환

name()

엘러먼트의 이름을 반환

namespace-uri()

문서 순서에서 첫 번째인 인수 노드셋(argument node-set)의 노드의 확장명의 이름 공간 URI를 반환

position()

식 평가 컨텍스트(expression evaluation context)로부터 컨텍스트의 포지션에 해당하는 수를 반환

문자열 함수(String Functions)

이름

설명

예제 및 결과

concat()

Returns 인수의 연접을 반환

concat('The',' ','XML')

결과: 'The XML'

contains()

첫 번째 문자열이 두 번째 문자열을 포함하고 있으면 참이며 그 이외에는 거짓

contains('XML','X')

결과: true

normalize-space()

앞뒤의 공백을 제거

normalize-space(' The XML')

결과: 'The XML'

starts-with()

첫 번째 문자열이 두 번째 문자열로 시작하면 참이며 그 이외에는 거짓

starts-with('XML','X') 

결과: true

string()

객체를 문자열로 변환

string(3.14) 

결과: '3,14'

string-length()

문자열 속의 문자의 개수를 반환

string-length('Beatles') 

결과: 7

substring()

부분 문자열을 반환

substring('Beatles',1,4) 

결과: 'Beat'

substring-after()

부분 문자열 뒤의 부분 문자열을 반환

substring-after('12/10','/')

결과: '10'

substring-before()

부분 문자열 앞의 부분 문자열을 반환

substring-before('12/10','/') 

결과: '12'

translate()

문자를 문자열로 변환

translate('12:30',':','!') 

결과: '12!30'

수치 함수(Number Functions)

이름

설명

예제 및 결과

ceiling()

인수보다 크지 않은 작은 정수 반환

ceiling(3.14) 

결과: 4

floor()

인수보다 크기 않은 가장 큰 정수 반환

floor(3.14)

결과: 3

number()

인수를 수로 변환

number(price)

round()

인수에 가장 근접한 정수를 반환

round(3.14) 

결과: 3

sum()

인수 노드 셋의 각 노드에 대한 노드의 문자열 값을 수로 변환한 결과의 합을 반환

sum(/cd/price)

불리언 함수(Boolean Functions)

이름

설명

예제 및 결과

boolean()

인수를 불리언으로 변환

 

false()

거짓 반환

number(false()) 

결과: 0

lang()

 

 

not()

인수가 참이면 거짓 반환, 나머지의 경우는 거짓

not(false())

true()

참 반환

number(true())

결과 : 1

3.5 XPath 예제

지금 까지 배운 내용을 앞의 예제를 사용하여 설명한다.

collection.xml



<?xml version="1.0" encoding="EUC-KR"?>

<catalog>

<cd>

<title>San DoKaebi</title>

<artist>기둥SeulKiDoong</artist>

<country>Korea</country>

<company>Dongeui</company>

<price>8000</price>

<year>1992</year>

</cd>


<cd>

<title>Say Yes</title>

<artist>Chake&Aska</artist>

<country>Japan</country>

<company>Sony 레코드</company>

<price>12000</price>

<year>1992</year>

</cd>

<cd>

<title>Hound dog</title>

<artist>Elvis Presley</artist>

<country>USA</country>

<company>RCA</company>

<price>9000</price>

<year>1972</year>

</cd>

<cd>

<title>Still got the blues</title>

<artist>Gary Moore</artist>

<country>UK</country>

<company>Virgin records</company>

<price>10.20</price>

<year>1990</year>

</cd>

<cd>

<title>Romanza</title>

<artist>Andrea Bocelli</artist>

<country>EU</country>

<company>Polydor</company>

<price>15000</price>

<year>1996</year>

</cd>

<cd>

<title>When a man loves a woman</title>

<artist>Percy Sledge</artist>

<country>USA</country>

<company>Atlantic</company>

<price>8000</price>

<year>1987</year>

</cd>

<cd>

<title>Pavarotti Gala Concert</title>

<artist>Luciano Pavarotti</artist>

<country>UK</country>

<company>DECCA</company>

<price>13000</price>

<year>1991</year>

</cd>

 <cd>

<title>Unchain my heart</title>

<artist>Joe Cocker</artist>

<country>USA</country>

<company>EMI</company>

<price>10000</price>

<year>1987</year>

</cd>

</catalog>


노드 선정


지금부터는 XML 문서로부터 어떻게 노드들을 추출하는지를 인터넷 익스플로러에서 selectNode 함수를 사용하여 보여준다.  이 함수는 경로식을 인자로써 사용할 것이다.


xmlobject.selectNodes(XPath expression)


cd 노드 선택


아래의 예제는 catalog의 모든 cd를 선택하는 예제이다.


xmlDoc.selectNodes("/catalog/cd")


코드 :


<html>

<body>

<script type="text/vbscript">


set xmlDoc=CreateObject("Microsoft.XMLDOM")

xmlDoc.async="false"

xmlDoc.load("cdcatalog.xml")


path="/catalog/cd"

set nodes=xmlDoc.selectNodes(path)


for each x in nodes

  document.write("<xmp>")

  document.write(x.xml)

  document.write("</xmp>")

next


</script>

</body>

</html>



결과 :


<cd>

<title>San DoKaebi</title>

<artist>기둥SeulKiDoong</artist>

<country>Korea</country>

<company>Dongeui</company>

<price>8000</price>

<year>1992</year>

</cd>


<cd>

<title>Say Yes</title>

<artist>Chake&Aska</artist>

<country>Japan</country>

<company>Sony 레코드</company>

<price>12000</price>

<year>1992</year>

</cd>

<cd>

<title>Hound dog</title>

<artist>Elvis Presley</artist>

<country>USA</country>

<company>RCA</company>

<price>9000</price>

<year>1972</year>

</cd>

<cd>

<title>Still got the blues</title>

<artist>Gary Moore</artist>

<country>UK</country>

<company>Virgin records</company>

<price>12000</price>

<year>1990</year>

</cd>

<cd>

<title>Romanza</title>

<artist>Andrea Bocelli</artist>

<country>EU</country>

<company>Polydor</company>

<price>15000</price>

<year>1996</year>

</cd>

<cd>

<title>When a man loves a woman</title>

<artist>Percy Sledge</artist>

<country>USA</country>

<company>Atlantic</company>

<price>8000</price>

<year>1987</year>

</cd>

<cd>

<title>Pavarotti Gala Concert</title>

<artist>Luciano Pavarotti</artist>

<country>UK</country>

<company>DECCA</company>

<price>13000</price>

<year>1991</year>

</cd>

 <cd>

<title>Unchain my heart</title>

<artist>Joe Cocker</artist>

<country>USA</country>

<company>EMI</company>

<price>10000</price>

<year>1987</year>

</cd>




첫 번째 노드 선택하기


아래의 예제는 cd catalog의 첫 번째 cd 노드만을 선택한다.


mlDoc.selectNodes("/catalog/cd[0]")


코드 :


<html>

<body>

<script type="text/vbscript">


set xmlDoc=CreateObject("Microsoft.XMLDOM")

xmlDoc.async="false"

xmlDoc.load("cdcatalog.xml")


path="/catalog/cd[0]"

set nodes=xmlDoc.selectNodes(path)


for each x in nodes

  document.write("<xmp>")

  document.write(x.xml)

  document.write("</xmp>")

next


</script>

</body>

</html>



결과 :


<cd>

<title>San DoKaebi</title>

<artist>기둥SeulKiDoong</artist>

<country>Korea</country>

<company>Dongeui</company>

<price>8000</price>

<year>1992</year>

</cd>



Note: IE 5 에서는 [0]



price 노드 선택하기


아래의 코드는 cd catalog 로부터 모든 price 노드를 선택하는 예제이다.


xmlDoc.selectNodes("/catalog/cd/price")


코드 :


<html>

<body>

<script type="text/vbscript">


set xmlDoc=CreateObject("Microsoft.XMLDOM")

xmlDoc.async="false"

xmlDoc.load("cdcatalog.xml")


path="/catalog/cd/price"

set nodes=xmlDoc.selectNodes(path)


for each x in nodes

  document.write("<xmp>")

  document.write(x.xml)

  document.write("</xmp>")

next


</script>

</body>

</html>


결과 :


<price> 8000 </price>

<price> 12000 </price>

<price> 9000 </price>

<price> 12000 </price>

<price> 15000 </price>

<price> 8000 </price>

<price> 13000 </price>

<price> 10000 </price>




price 텍스트 노드 선택하기


어래의 코드는 price 노드로부터 오직 텍스트만을 선택한다.


xmlDoc.selectNodes("/catalog/cd/price/text()")


코드 :


<html>

<body>

<script type="text/vbscript">


set xmlDoc=CreateObject("Microsoft.XMLDOM")

xmlDoc.async="false"

xmlDoc.load("cdcatalog.xml")


path="/catalog/cd/price/text()"

set nodes=xmlDoc.selectNodes(path)


for each x in nodes

  document.write("<xmp>")

  document.write(x.xml)

  document.write("</xmp>")

next


</script>

</body>

</html>



결과 :


8000

12000

9000

12000

15000

8000

13000

10000



price가 1200 이상인 cd 노드 선택


아래의 예제는 price가 12000이상인 모든 cd 노드를 선택한다.


<html>

<body>

<script type="text/vbscript">


set xmlDoc=CreateObject("Microsoft.XMLDOM")

xmlDoc.async="false"

xmlDoc.load("cdcatalog.xml")


path="/catalog/cd[price>10.80]"

set nodes=xmlDoc.selectNodes(path)


for each x in nodes

  document.write("<xmp>")

  document.write(x.xml)

  document.write("</xmp>")

next


</script>

</body>

</html>


결과 :


<cd>

<title>Say Yes</title>

<artist>Chake&Aska</artist>

<country>Japan</country>

<company>Sony 레코드</company>

<price>12000</price>

<year>1992</year>

</cd>

<cd>

<title>Still got the blues</title>

<artist>Gary Moore</artist>

<country>UK</country>

<company>Virgin records</company>

<price>12000</price>

<year>1990</year>

</cd>

<cd>

<title>Romanza</title>

<artist>Andrea Bocelli</artist>

<country>EU</country>

<company>Polydor</company>

<price>15000</price>

<year>1996</year>

</cd>

<cd>

<title>Pavarotti Gala Concert</title>

<artist>Luciano Pavarotti</artist>

<country>UK</country>

<company>DECCA</company>

<price>13000</price>

<year>1991</year>

</cd>



price가 1200 이상인 price 노드 선택


아레의 예제는 price가 12000이상인 모든 price 노드를 선택한다.


xmlDoc.selectNodes("/catalog/cd[price>10.80]/price")


코드 :


<html>

<body>

<script type="text/vbscript">


set xmlDoc=CreateObject("Microsoft.XMLDOM")

xmlDoc.async="false"

xmlDoc.load("cdcatalog.xml")


path="/catalog/cd[price>10.80]/price"

set nodes=xmlDoc.selectNodes(path)


for each x in nodes

  document.write("<xmp>")

  document.write(x.xml)

  document.write("</xmp>")

next


</script>

</body>

</html>



결과 :


<price>12000</price>

<price>12000</price>

<price>15000</price>

<price>13000</price>

[출처] XPath 문법|작성자 개구리


출처 - http://blog.naver.com/PostView.nhn?blogId=cardin9&logNo=20032909370






1
2
3
4
5
6
7
8
9
10
11
12
<aaa>
    <bbb>
        <ccc>
            <ddd aaa="bbb">rock</ddd>
            <eee>111</eee>
        </ccc>
        <ccc>
            <ddd>stripe</ddd>
            <eee>222</eee>
        </ccc>
    </bbb>
</aaa>

  

1. ddd의 TEXT가 rock인 것 가져오기

expresion= /aaa/bbb/ccc/ddd[text() = 'rock']

  

2. ddd의 TEXT가 rock인 것 형제들 가져 오기

expresion= /aaa/bbb/ccc/ddd[text() = 'rock']/following-sibling::*

  

3. ddd의 attribute aaa가 bbb인 것 가져오기

expresion=/aaa/bbb/ccc/ddd[@aaa='bbb']

  

4. 2번째 ddd 가져오기

expresion=/aaa/bbb/ccc/ddd[2]

  

5. 마지막 ddd 가져 오기

expresion=/aaa/bbb/ccc/ddd[last()]


출처 - http://moonlighting.tistory.com/71






xpath 를 이용할수 있다는 걸 알기전에는 무식하게도 Document 클래스의 getElementById() 나 getElementsByTagName() 메소드를 이용해서 

상당히 무식하게 난해한 코드로 xml 을 파싱하곤 했었다 -_-



어느날 문득 xpath 에 대해서 살짝 알게되고 나서 부터는 전에 쓰던 방법에 비해서는 아주 간결하고 이해하기 쉬운 코드로 xml 에서 원하는 데이터를 땡겨다 쓰는게 훨씬 수월해 졌다.




※ xpath 문법에 대해서 왠만한걸 쉽게 파악하기 위해서는 요 사이트에 가면 된다.

http://www.zvon.org/xxl/XPathTutorial/General/examples.html

요기 가서 보면 알겠지만 쉽게 쉽게 설명되있다. 

xpath 만 어느정도 쓸 수 있으면 xml 에서 원하는 데이터를 땡겨오는건 매우 쉬워지니 살짝 한번 연구해 보는걸 추천한다.





xpath를 이용해서 xml 에서 원하는 데이터를 파싱하는 예제코드를 작성해 보았다. 

xpath 를 사용하기 위해서 별다로 다른 라이브러리를 classpath 에 추가 안해도 된다.




예제 코드에서 사용된 xml

1
2
3
4
5
6
7
8
9
10
<root>
    <row>
        <col1 id="c1">값1</col1>
        <col2 id="c2" val="val2">값2</col2>
    </row>
    <row>
        <col1 id="c3">값3</col1>
        <col2 id="c4">값4</col2>
    </row>
</root>



예제 코드는 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.io.StringReader;
 
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
 
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
 
 
public class XPathTest{
    public static void main(String[] args) throws Exception {
        String xml = "<root><row><col1 id='c1'>값1</col1><col2 id='c2' val='val2'>값2</col2></row>" +
                             "<row><col1 id='c3'>값3</col1><col2 id='c4'>값4</col2></row></root>";
         
        // XML Document 객체 생성
        InputSource is = new InputSource(new StringReader(xml));
        Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
 
        // 인터넷 상의 XML 문서는 요렇게 생성하면 편리함.
        //Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder()
        //                               .parse("http://www.example.com/test.xml");
         
         
         
        // xpath 생성
        XPath xpath = XPathFactory.newInstance().newXPath();
         
 
         
         
        // NodeList 가져오기 : row 아래에 있는 모든 col1 을 선택
        NodeList cols = (NodeList)xpath.evaluate("//row/col1", document, XPathConstants.NODESET);
        for( int idx=0; idx<cols.getLength(); idx++ ){
            System.out.println(cols.item(idx).getTextContent());
        }
        // 값1   값3  이 출력됨
         
         
         
         
         
        // id 가 c2 인 Node의 val attribute 값 가져오기
        Node col2 = (Node)xpath.evaluate("//*[@id='c2']", document, XPathConstants.NODE);
        System.out.println(col2.getAttributes().getNamedItem("val").getTextContent());
        // val2 출력
         
         
         
         
         
        // id 가 c3 인 Node 의 value 값 가져오기
        System.out.println(xpath.evaluate("//*[@id='c3']", document, XPathConstants.STRING));
        // 값3 출력
    }
}


전에 getElementById(), getElementsByTagName() 요걸 쓰던 코드에 비하면 코드도 쉽게 읽히고 심플하기도 서울역에 그지없다.

앞으로 xml 파싱할때는 xpath 를 주로 써야겠다.



※ evalueate() 메소드 맨 끝에 들어가는 파라메터로

XPathConstants.NODESET
XPathConstants.NODE
XPathConstants.BOOLEAN
XPathConstants.NUMBER
XPathConstants.STRING

요런걸 쓸 수 있다. 변수 이름을 보면 대충 어떨때 써야 할지 알 수 있을것이라 생각한다.


출처 - http://stove99.tistory.com/106





'Development > XML' 카테고리의 다른 글

XQuery  (0) 2013.02.20
XSL(Extensible Stylesheet Language)  (0) 2013.02.19
XPath  (0) 2013.02.19
XML - XML 스키마(XSD) 및 xsi 접두어 의미  (0) 2012.10.02
XML - XML 예약문자  (0) 2012.09.16
xml namespace  (0) 2012.03.24
Posted by linuxism

댓글을 달아 주세요