XPath : 값을 기준으로 요소를 선택하는 방법은 무엇입니까?


221

XPath를 처음 사용하는데 이것은 기본적인 질문 일 수 있습니다. 친절하게 나와 함께 문제를 해결하는 데 도움이됩니다. 다음과 같은 XML 파일이 있습니다.

<RootNode>
  <FirstChild>
    <Element attribute1="abc" attribute2="xyz">Data</Element>
  <FirstChild>
</RootNode>

다음을 사용하여 <Element>태그가 있는지 확인할 수 있습니다 .

// 요소 [@ attribute1 = "abc"및 @ attribute2 = "xyz"]

이제 문자열의 태그 값을 확인하고 싶습니다 "Data". 이것을 달성하기 위해 나는 사용하도록 들었다.

// 요소 [@ attribute1 = "abc"및 @ attribute2 = "xyz"및 데이터]

나중에 식을 사용하면 다음 오류가 발생합니다.

어설 션 실패 메시지 : 일치하는 노드가 없습니다 //Element[@attribute1="abc" and @attribute2="xyz" and Data]

내가 사용한 XPath 표현식이 유효한지 조언 해주십시오. 그렇지 않은 경우 유효한 XPath 표현식은 무엇입니까?

답변:


329

아래 조건 :

//Element[@attribute1="abc" and @attribute2="xyz" and Data]

요소 값 데이터가 아닌 요소 내에 요소 데이터가 있는지 확인합니다.

대신에 당신은 사용할 수 있습니다

//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]

25
//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]

나는이 대답을 추가하는 이유는 내가의 관계를 설명 할 것입니다 .text().

첫 번째는를 사용할 때 []두 가지 유형의 데이터 만 있습니다.

  1. [number] 노드 세트에서 노드를 선택하려면
  2. [bool] 노드 세트에서 노드 세트를 필터링하려면

이 경우 함수 boolean()에 의해 값이 부울로 평가되며 규칙이 있습니다.

필터는 항상 컨텍스트와 관련하여 평가됩니다.

text()또는 .문자열 을 비교해야 할 때 "Data"먼저 string()부울 결과를 얻는 것보다 함수를 사용 하여 문자열 유형으로 변환합니다.

다음과 같은 두 가지 중요한 규칙이 있습니다 string().

  1. string()함수는 노드 세트에서 첫 번째 노드의 문자열 값을 리턴하여 노드 세트를 문자열로 변환합니다. 일부 경우 예기치 않은 결과가 발생할 수 있습니다.

    text() 노드 세트를 반환하는 상대 경로는 현재 노드의 모든 텍스트 노드를 포함합니다 (컨텍스트 노드). ["Data"] . 로 평가하면 string(["Data"])노드 세트의 첫 번째 노드가 반환되므로 노드 세트에 하나의 텍스트 노드 만있는 경우에만 "데이터"가 표시됩니다.

  2. 당신이 원하는 경우 string() 기능은 모든 자식 텍스트를 연결하는, 당신은 다음 노드 집합 대신 하나의 노드를 통과해야합니다.

    예를 들어, 우리는 노드 집합을 얻을 ['a', 'b'], 당신은 거기 부모 노드를 통과 할 수 string(parent)이 반환합니다 'ab'및 원인의 string(.)당신의 경우는 연결된 문자열을 반환합니다"Data" .

텍스트 노드가있는 경우에만 두 가지 방법 모두 동일한 결과를 얻습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.