HTML 코드의 각 요소와 속성들은 계층 관계를 이루고 있으며 XPath에서는 이러한 계층 관계를 트리(Tree) 구조로 표현합니다. 이때 축은 트리 구조에서 노드(node : 데이터 지점, 단위)를 참조하고 선택하는 데 사용되는 방향 또는 관계를 나타냅니다. 축에는 self 축, parent 축, child 축 등이 있는데 아래에서 예시를 사용하여 하나씩 설명드리겠습니다.
위 요소들의 계층 구조를 그림으로 나타내면 다음과 같습니다.
이제 축을 사용하여 어떻게 노드를 나타낼 수 있는지 알아보도록 하겠습니다.
3. 노드(node)의 표현 방법
3.1. self
: 현재 노드를 자체를 나타냅니다.
/AAA/self::*
위의 XPath의 결과로는 현재 노드인 <AAA> 요소가 선택됩니다.
3.2. parent
: 현재 노드의 부모 노드를 나타냅니다.
/AAA/EEE/FFF/parent::*
위의 XPath의 결과로는 현재 노드인 <FFF> 요소의 부모 노드인 <EEE> 요소가 선택됩니다.
3.3. child : 현재 노드의 자식 노드를 나타냅니다.
/AAA/EEE/FFF/child::*
위의 XPath의 결과로는 현재 노드인 <FFF> 요소의 자식 노드인 <GGG>, <GGG>, <III>가 모두 선택됩니다.
여기서 <III> 요소만을 고르고 싶다면 다음과 같이 XPath를 수정할 수 있습니다.
/AAA/EEE/FFF/child::III
또한, 두 <GGG> 요소 중 첫번째 <GGG> 요소를 고르고 싶다면 다음과 같이 수정할 수 있습니다.
/AAA/EEE/FFF/child::GGG[1]
이때, 대부분의 다른 프로그래밍 언어와는 다르게 XPath에서는 인덱스가 1부터 시작함을 주의해야 합니다!
3.3. ancestor
: 현재 노드의 모든 조상 노드를 나타냅니다.
/AAA/EEE/FFF/ancestor::*
위의 XPath의 결과로는 현재 노드인 <FFF> 요소의 조상 노드인 <EEE>, <AAA>가 모두 선택됩니다.
3.4. descendant
: 현재 노드의 모든 후손 노드를 나타냅니다.
/AAA/EEE/FFF/descendant::*
위의 XPath의 결과로는 현재 노드인 <FFF> 요소의 후손 노드인 <GGG>, <GGG>, <III>, <JJJ>가 모두 선택됩니다.
3.5. ancestor-or-self
: 현재 노드와 현재 노드의 모든 조상 노드를 나타냅니다.
/AAA/EEE/FFF/ancestor-or-self::*
위의 XPath의 결과로는 현재 노드인 <FFF> 요소 자신과 조상 노드가 모두 선택되어 <FFF>, <EEE>, <AAA>가 모두 선택됩니다.
3.6. descendant-or-self
: 현재 노드와 현재 노드의 모든 후손 노드를 나타냅니다.
/AAA/EEE/FFF/descendant-or-self::*
위의 XPath의 결과로는 현재 노드인 <FFF> 요소 자신과 후손 노드가 모두 선택되어 <FFF>, <GGG>, <GGG>, <III>, <JJJ>가 모두 선택됩니다.
3.7. following
: 현재 노드의 태그를 종료한 뒤에 나오는 모든 노드를 나타냅니다.
/AAA/EEE/following::*
위의 XPath의 결과로는 현재 노드인 <EEE> 다음에 나오는 노드인 <FFF>, <GGG>, <GGG>, <III>, <JJJ>, <KKK>, <LLL>이 모두 선택됩니다.
3.8. preceding
: 현재 노드의 태그가 시작되기 전에 나오는 모든 노드를 나타냅니다.
/AAA/EEE/preceding::*
위의 XPath의 결과로는 현재 노드인 <EEE> 이전에 나오는 노드인 <BBB>, <CCC>, <DDD>가 모두 선택됩니다.
3.9. following-sibling
: 현재 노드 다음에 나오는 모든 형제 노드를 나타냅니다.
/AAA/EEE/following-sibling::*
위의 XPath의 결과로는 현재 노드인 <EEE> 다음에 나오는 형제 노드인 <KKK>가 선택됩니다.
3.10. preceding-sibling
: 현재 노드 이전에 나오는 모든 형제 노드를 나타냅니다.
/AAA/EEE/preceding-sibling::*
위의 XPath의 결과로는 현재 노드인 <EEE> 이전에 나오는 형제 노드인 <BBB> 가 선택됩니다.
지금까지 XPath에서 노드를 나타내기 위해 사용되는 축에 대해 알아보았습니다.
추가로, XPath에서 사용할 수 있는 또 다른 두 함수에 대해 알아보겠습니다.
4. XPath에 사용하는 함수
4.1. count
: 특정 조건에 맞는 노드의 개수를 반환합니다.
#class 속성 값이 ‘example인 div 요소의 개수를 반환
count(//div[@class="example"])
#p 요소의 총 개수를 반환
count(//p)