본문으로 건너뛰기
AZ Tools

XPath 테스터

브라우저에서 XML이나 HTML에 XPath 식을 실행해 일치하는 모든 노드를 봅니다. 네임스페이스 접두어와 해석 오류도 함께 보고합니다.

사용법

  1. XML이나 HTML을 문서 칸에 붙여 넣고 맞는 해석 방식을 고릅니다. XML은 엄격해서 오류를 보고하고, HTML은 고칠 수 있는 것을 고칩니다.
  2. XPath 식을 입력하거나 예시를 눌러 속성 필터, count(), text() 노드, local-name()이 어떻게 동작하는지 봅니다.
  3. 문서에 기본 네임스페이스가 있다면 네임스페이스 칸에서 접두어를 묶고 식에서 그 접두어를 쓰십시오.

자세한 설명

펼치기

문서를 붙여 넣고 식을 입력하면 무엇이 선택되는지 보입니다. 평가는 브라우저 자체의 XPath 엔진이 하므로, 여기서 얻는 결과가 여러분의 코드에서 document.evaluate가 내놓을 결과입니다. 일치한 노드가 직렬화된 형태로 하나씩 나열되거나, string()·count()·starts-with() 같은 함수가 노드 집합 대신 돌려주는 문자열·숫자·불리언이 나옵니다.

엔진은 XPath 1.0이고, 이것이 가장 먼저 알아야 할 점입니다. 모든 브라우저가 1.0만 싣고 그 이상은 싣지 않으므로, 사람들이 손을 뻗는 2.0과 3.1 함수는 아예 없습니다. matches(), lower-case(), ends-with(), tokenize()는 빈 결과를 돌려주는 것이 아니라 문법 오류로 거부됩니다. 1.0에서 대응하는 것은 contains(), translate(), substring() 계열, 그리고 접미사 검사를 위한 substring(s, string-length(s) - n) 관용구입니다. 여기서 거부된 식은 lxml과 libxml2 기반 도구에서도 같은 이유로 거부됩니다.

실제 문서가 첫 시도를 무너뜨리는 곳은 대개 네임스페이스입니다. XPath 1.0에는 기본 네임스페이스라는 개념이 없습니다. 문서가 <feed xmlns="http://www.w3.org/2005/Atom">으로 열린다면 //entry는 아무것도 맞히지 못합니다. 식에 쓴 접두어 없는 이름은 “네임스페이스 없음”을 뜻하는데 문서의 모든 요소는 Atom 네임스페이스에 있기 때문입니다. 빠져나갈 길은 둘이고 이 도구는 둘 다 지원합니다. 네임스페이스 칸에 접두어를 묶고 //a:entry라고 쓰거나, //*[local-name()='entry']로 문제 자체를 비켜 가는 것입니다. 기본 네임스페이스를 선언한 문서에서 질의가 빈 결과를 내면 이 도구가 그 사실을 알려 주므로 추측하지 않아도 됩니다.

해석 방식도 같은 이유로 반대 방향에서 중요합니다. XML 해석은 엄격해서 닫히지 않은 태그 하나로도 해석 오류가 납니다. 이 도구는 그것을 보고합니다. 브라우저는 그래도 부분 문서를 돌려주고 XPath는 살아남은 조각을 대상으로 실행되어, 그럴듯해 보이지만 사실이 아닌 답을 내기 때문입니다. HTML 해석은 관용적이어서 마크업을 대신 고쳐 줍니다. 실제 페이지를 긁어 올 때 원하는 동작입니다. 다만 그곳에서는 요소 이름이 대문자로 돌아옵니다. HTML 요소에 대해 DOM이 보고하는 값이 그것이기 때문입니다.

모든 처리는 로컬에서 이루어지며 문서는 업로드되지 않습니다.

자주 묻는 질문

matches()를 쓴 식이 실패하는 이유는?

브라우저는 XPath 1.0만 구현하고 matches()는 XPath 2.0 함수이기 때문입니다. lower-case(), upper-case(), ends-with(), tokenize(), replace()도 마찬가지입니다. 부분 문자열 검사에는 contains(), 대소문자 변환에는 translate()를 쓰고, 접미사 검사에는 substring(s, string-length(s) - string-length(접미사) + 1) = 접미사를 쓰십시오.

Atom 피드에서 //entry가 아무것도 못 맞히는 이유는?

피드가 기본 네임스페이스를 선언하고 있고 XPath 1.0은 그것을 물려받을 방법이 없기 때문입니다. XPath 식의 접두어 없는 이름은 “네임스페이스 없음”을 뜻하는데, 네임스페이스가 있는 문서의 어떤 요소도 그에 해당하지 않습니다. 접두어를 묶어 — 예컨대 a = http://www.w3.org/2005/Atom — //a:entry로 질의하거나, URI를 신경 쓰고 싶지 않다면 //*[local-name()="entry"]로 쓰십시오.

XML로 해석해야 합니까, HTML로 해석해야 합니까?

문서가 정형식이어야 하고 그렇지 않을 때 알려 주기를 원한다면 XML입니다. 웹에서 긁어 온 것이라면 HTML입니다. 그쪽에서는 닫히지 않은 태그와 암시된 요소가 정상이고, 해석기가 규격이 말하는 대로 브라우저가 끼워 넣는 것을 끼워 넣습니다. HTML 해석기는 마크업에 없어도 html, head, body를 추가한다는 점을 알아 두십시오. 그래서 /div에 고정한 식은 맞히지 못하는데 //div는 맞힙니다.

HTML 방식에서 요소 이름이 대문자인 이유는?

HTML 문서의 HTML 요소에 대해 nodeName이 보고하는 값이 그것이기 때문입니다. XPath가 한 일이 아니라 DOM의 관례입니다. HTML 요소에 대한 일치는 여전히 대소문자를 가리지 않으므로 //div가 <DIV>를 찾고 그 반대도 됩니다. XML 방식에서는 이름이 적힌 그대로 보고되고 그대로 일치합니다.

문서 전체를 평가합니까, 선택 영역만 평가합니까?

전체입니다. 문맥 노드가 문서 자체이므로 /로 시작하는 경로는 뿌리에 고정되고 //로 시작하면 어디든 찾습니다. 상대적인 문맥이 필요하면 표를 먼저 고르는 대신 //table[1]//td처럼 식 안에서 좁히십시오.

관련 도구