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 표현식은 무엇입니까?
답변
아래 조건 :
//Element[@attribute1="abc" and @attribute2="xyz" and Data]
요소 값 데이터가 아닌 요소 내에 요소 데이터가 있는지 확인합니다.
대신에 당신은 사용할 수 있습니다
//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]
답변
//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]
나는이 대답을 추가하는 이유는 내가의 관계를 설명 할 것입니다 .
및 text()
.
첫 번째는를 사용할 때 []
두 가지 유형의 데이터 만 있습니다.
[number]
노드 세트에서 노드를 선택하려면[bool]
노드 세트에서 노드 세트를 필터링하려면
이 경우 함수 boolean()
에 의해 값이 부울로 평가되며 규칙이 있습니다.
필터는 항상 컨텍스트와 관련하여 평가됩니다.
text()
또는 .
문자열 을 비교해야 할 때 "Data"
먼저 string()
부울 결과를 얻는 것보다 함수를 사용 하여 문자열 유형으로 변환합니다.
다음과 같은 두 가지 중요한 규칙이 있습니다 string()
.
-
이
string()
함수는 노드 세트에서 첫 번째 노드의 문자열 값을 리턴하여 노드 세트를 문자열로 변환합니다. 일부 경우 예기치 않은 결과가 발생할 수 있습니다.text()
노드 세트를 반환하는 상대 경로는 현재 노드의 모든 텍스트 노드를 포함합니다 (컨텍스트 노드).["Data"]
. 로 평가하면string(["Data"])
노드 세트의 첫 번째 노드가 반환되므로 노드 세트에 하나의 텍스트 노드 만있는 경우에만 “데이터”가 표시됩니다. -
당신이 원하는 경우
string()
기능은 모든 자식 텍스트를 연결하는, 당신은 다음 노드 집합 대신 하나의 노드를 통과해야합니다.예를 들어, 우리는 노드 집합을 얻을
['a', 'b']
, 당신은 거기 부모 노드를 통과 할 수string(parent)
이 반환합니다'ab'
및 원인의string(.)
당신의 경우는 연결된 문자열을 반환합니다"Data"
.
텍스트 노드가있는 경우에만 두 가지 방법 모두 동일한 결과를 얻습니다.