XPath Tester 會針對您在瀏覽器中貼上的任何格式正確的 XML,評估 XPath 1.0 運算式,然後將自然的結果類型 —— 節點集、字串、數值或布林值 —— 以可見文字形式輸出,而不會在頁面中插入任何內容。 整個工作流程都在目前的分頁中執行:XML 會以 DOMParser 解析為獨立的文件,運算式則交給 Document.evaluate,匹配的節點會被序列化以便檢視。由於文件只存在於記憶體中而非頁面 DOM,您可以貼上 API 回應、匯出的 SOAP envelope、儲存的 RSS feed,或從說明文件複製的片段,並在數秒內開始查詢。不需要建立專案、不需要內嵌腳本,也不會上傳任何資料到伺服器。

為什麼 Chrome 主控台的 $x() 輔助函式只處理當前頁面
Chrome DevTools 提供兩種快速測試 XPath 運算式的方式:Elements 面板的搜尋框(Elements 中按 Ctrl/Cmd+F),以及主控台中的 $x("//div") 輔助函式。這兩種機制都是對瀏覽器目前正在渲染的文件進行查詢。一旦您的 XML 並非正在渲染的頁面 —— 也就是當您把 API 回應複製到文字編輯器、從某個工具匯出 SOAP envelope、將 RSS feed 存成檔案,或從靜態網站產生器中擷取片段時 —— 兩個輔助函式都幫不上忙。沒有可供輔助函式查詢的即時文件。
您可以把 XML 當作字串貼進主控台,但主控台無法為您將它解析成 DOM。把長長的 SOAP envelope 貼進主控台並重新執行 $x(),只會對當前頁面進行匹配,而非您剛剛貼上的 envelope。這就是 XPath Tester 所填補的缺口。它會在瀏覽器中根據您的 XML 建立一個獨立的 DOM,對該 DOM 評估您的運算式,並顯示結果,完全不碰頁面本身。
評估流程內部
此工具會執行四個不同的步驟,且順序很重要。首先,您貼上的 XML 會使用 application/xml 的 MIME 類型,透過 DOMParser 解析。如果解析器回傳 parsererror 文件,工具會將其視為失敗,並拒絕評估任何 XPath —— 不匹配的標籤、未跳脫的 & 符號以及其他格式錯誤,會直接中斷執行,而不是產生令人困惑的空白結果。
其次,解析後的文件以獨立 DOM 的形式存在於記憶體中。它不會被插入到頁面中,因此匹配到的元素無法執行腳本、載入遠端資源或影響版面。第三,您輸入的 XPath 1.0 運算式會以 ANY_TYPE 傳遞給 Document.evaluate,讓瀏覽器回報運算式的自然結果,而不是強制轉成節點清單。
第四,結果會以可見文字呈現。節點集的匹配結果會以每行一個並加上編號的方式列出。屬性會以明確的 @ 形式表示。文位元組點與註解節點都會帶有可見的標籤,以免註解節點被誤認為空文字。這些輸出內容都不會變成即時標記,而是結果面板中的純文字。
四步驟執行 XPath 查詢
- 貼上 XML 測試資料。 在根元素上完整保留您的目標文件所使用的命名空間宣告 —— 例如,如果您打算稍後選取 b:book,就寫 xmlns:b="urn:books"。
- 輸入 XPath 1.0 運算式。 請控制在 2,000 字元的限制內,並在大型輸入中優先使用明確的絕對路徑,而非廣泛的後代搜尋。
- 執行評估。 瀏覽器會解析 XML、建立獨立文件,然後對其呼叫 Document.evaluate。
- 閱讀結果面板。 請注意結果類型(節點集、字串、數值或布林值),逐一檢視每個編號的匹配結果,然後將同一個運算式移至實際執行該運算式的正式環境中。
為了獲得最佳效果,請保留一份具代表性的測試資料,並在每次變更後重新執行。此工具不會儲存歷史紀錄,因此穩定的貼上緩衝區需要由您自行維護。如果您收到的 XML 經過壓縮、難以閱讀,XML Formatter 是個實用的輔助工具,方便您在貼上之前先整理內容。
解讀輸出:每種結果類型的樣貌
在 XPath 1.0 規範下,XPath 運算式會回傳四種不同的結果類型,而 XPath Tester 會保留這種區別,不會把所有內容壓平成一個扁平清單。正是這種區別決定了同一個運算式在 lxml、libxml2 或 Java 的 javax.xml.xpath 下游是否能正常運作。
| XPath 結構 | 自然的結果類型 | XPath Tester 如何顯示 |
|---|---|---|
| //book | node-set | 以編號清單列出序列化後的元素節點及其子節點 |
| string-length(title) | number | 純量值(例如 42)獨立顯示一行 |
| count(//book) | number | 純量值(例如 7)獨立顯示一行 |
| contains(title, 'XML') | Boolean | true 或 false 獨立顯示一行 |
| normalize-space(.//p) | string | 回傳的文字獨立顯示一行,與單一節點集的匹配結果有所區隔 |
像 string()、count() 和 boolean() 這類函式永遠會產生其純量結果,即使您可能預期會得到節點集。空字串與零節點集都是有效的結果,且會與解析錯誤及運算式錯誤明確區分;後兩者會以固定的標籤前綴標示,但仍保留瀏覽器底層訊息以供診斷。
命名空間與前綴:零匹配最常見的原因
在 XPath 1.0 中,像 book 這樣未加前綴的名稱會選取無命名空間的元素。在根元素上宣告 xmlns="urn:books" 作為預設命名空間,並不會改變這條規則 —— 預設命名空間是用於元素建立的,而非用於 XPath 匹配。如果您貼上 XML 並寫下 //book,即使每個 book 元素都清楚存在於已解析的 DOM 中,工具仍會回傳零個匹配。
修正方法是在根元素上將命名空間綁定至一個前綴,並在運算式中使用該前綴。如果根元素宣告了 xmlns:b="urn:books",那麼運算式 //b:book 就會選取帶有命名空間的元素。保留的 xml 前綴會自動對應,因此 xml:lang 無需額外設定即可運作。如果 XML 使用預設命名空間而您又無法變更,您的運算式需要使用 //*[local-name()='book'] 這類變通寫法 —— 但使用正式的前綴會更乾淨。
同樣的陷阱也會出現在正式環境中。許多伺服器端的 XPath 程式庫都沿用相同的 XPath 1.0 規則,因此一個在 XPath Tester 中回傳零匹配的運算式,在您的爬蟲中同樣會回傳零匹配,除非另行設定該程式庫。透過此工具通過的測試,刻意被設計成具有實質意義的驗證,而非巧合。
限制、錯誤以及工具拒絕做的事
XPath Tester 公開明確的上限,讓您能預先規劃,而不是在除錯過程中才發現它們。XML 來源限制為 500,000 字元、運算式限制為 2,000 字元、匹配節點限制為 500 個、顯示的結果文字限制為 1,000,000 字元。達到匹配上限會被視為失敗:工具拒絕呈現部分結果,並要求您縮小運算式範圍。這是刻意設計的 —— 靜默截斷比錯誤訊息更糟糕。
此實作遵循瀏覽器的 XPath 1.0 介面,而非 XPath 2.0、3.1、XQuery、XSLT、CSS 選擇器或 JSONPath。後續版本中的序列、映射、陣列、正則表達式函式及具型別的值都不在範圍內。工具不會擷取遠端文件、不會追蹤連結、不會執行腳本、不會修改來源 XML、不會將匹配的標記插入頁面,也不會儲存查詢紀錄。它也不會根據 XSD 或 DTD 進行驗證 —— 匹配只能證明 XML 可被解析、且運算式能選取節點,無法證明該文件符合任何業務規則。
處理敏感的 XML 時,請比照任何開發者工具,採取相同的螢幕分享與剪貼簿防護措施。XML 永遠不會離開這個分頁,但您從結果面板複製出去的內容,仍會遵循一般的剪貼簿規則。
當同一個運算式在正式環境中表現不同時
在此工具中通過測試是一個有用的篩選條件,而非最終結論。伺服器端的程式庫、瀏覽器的 XPath 以及此工具都實作了 XPath 1.0,但在邊界情況上有所不同。下表整理了在乾淨的測試通過後,最常讓人踩雷的情境。
| 環境 | XPath 版本 | 命名空間原則 | 與 XPath Tester 的常見差異 |
|---|---|---|---|
| XPath Tester(瀏覽器 DOM) | 1.0 | 從文件根解析前綴,加上保留的 xml 前綴 | 基準參考 |
| 瀏覽器 $x() 與 Elements 搜尋 | 1.0 | 使用即時頁面的前綴;未加前綴的名稱會對應 HTML 命名空間 | 文件不同,根與前綴也不同 |
| Python lxml | 1.0(含擴充功能) | 在建構時需要明確提供命名空間字典 | 僅在根元素上宣告的命名空間不夠,API 會要求在呼叫時提供 |
| Java javax.xml.xpath | 1.0 | 非預設前綴必須提供 Resolver | 在於 Resolver 設定,而非僅僅運算式語法 |
| .NET XPathNavigator | 1.0(較新版本為 XPath 2.0) | 需要 Namespace manager | 版本差異可能帶入 XPath Tester 會拒絕的函式 |
若要可靠地使用,請保留具代表性的測試資料、明確宣告前綴、同時測試有匹配與零匹配的情境,並在目標執行環境中驗證同一個運算式。此工具是確認瀏覽器以您預期的方式解讀 XPath 的最快方式;但它無法取代在實際執行的環境中執行該運算式。若想深入了解背後的基本概念,MDN Document.evaluate 參考文件 記載了 XPath Tester 所呼叫的同一個瀏覽器介面。
如果您正在權衡各種方案,如何在 Notepad++ 中將 XML 轉換為 JSON 一文對此有詳細說明。
如果您正在權衡各種方案,在不上傳的情況下將 XML 轉換為 CSV 檔案 一文對此有詳細說明。