資料格式與結構化資料
XML 無法解析,如何檢查標籤與字元參照?
使用工具
匯入 XML 時末行報錯,補上結束標籤又在別處失敗。不妨縮小為一筆紀錄,追蹤每個元素的開始與結束。解析器發現問題的位置不一定就是最初寫錯的位置。
在 XML 整形工具中使用虛構訂單。放回應用前檢查編號、名稱、金額是否仍符合預期,無需真實客戶資料或憑證。縮排清楚不代表訂單內容或接收端規格也正確。
先配對名稱,再補標籤
<order id="A-17"><name>Notebook</title><amount>1200</amount></order>元素以 name 開始卻以 title 結束,執行應失敗。先查這個不匹配,不要先改最後的 order。不要從 Notebook 的意思猜欄位名,應確認接收格式要求 name 還是 title,再統一兩端。
<order id="A-17"><name>Notebook</name><amount>1200</amount></order>修正後 name 與 amount 應同在 order 內。工具不會決定欄位含義;為消除錯誤而刪掉陌生元素可能遺失必要資訊。一次只改一處,才能說明每次修改解決了什麼。
標籤數量相同也可能巢狀錯誤
<order><item><name>Notebook</item></name></order>每種標籤都有一對,但 item 在內部 name 之前關閉。應先關最內層,順序為 name、item、order。僅計數發現不了交叉,必須追蹤層級。
把失敗紀錄與正常紀錄比較。一個商品正常、兩個失敗時,檢查重複部分的邊界。縮小檔案時保留外層根元素,避免把裁切產生的新錯誤當成原問題。
區分文字字元與標記符號
<order><name>Pen & Paper</name><note>count < 10</note></order>Pen & Paper 中的 & 用 &,count < 10 中的小於號用 <。這是改變 XML 表示,不是商品名。應區分解碼後的值與 XML 原始碼中的寫法。
對已編碼文件全域替換 &,會把 & 變為 &amp;,接收端可能得到字面 &。原始文字編碼與處理成品 XML 應分開。整形輸出保留字元參照不一定異常,這不是欄位值的 HTML 顯示。
屬性引號也是值的邊界
<item code="A-17" note="Use "small" size"><name>Notebook</name></item>note 用雙引號包圍,內部雙引號寫作 "。提早結束值會讓後文看起來像另一個屬性。單字值正常不代表邊界正常,可分別用含空白、&、引號的虛構值測試。
工具依內部解析器的支援行為檢查語法,並非證明所有 XML 相容條件。不要認為 HTML 的無值屬性也適用於 XML。工具接受不保證接收端接受,仍需檢查對方輸入規格並實際驗證。
金額為空,標籤也可以正確
把 1200 改成空值或 twelve,標籤匹配時仍可能整形成功。語法無法決定金額是否必填、是否必須數字或使用哪種貨幣。把結構檢查與業務欄位驗證分開,才知道確認了什麼。
本頁面不依 XSD 驗證訂單,也不提交接收端。DTD 與實體宣告會被拒絕而非載入。為了通過而刪除 DOCTYPE 可能改變含義,應在合適的安全環境檢查依賴。
交付修正時保留值與結構證據
說明哪些標籤配對、哪些字元逸出,而不只是「整形成功」。檢查 A-17、Notebook、1200,再用含 & 的名稱重複檢查。空白有意義的混合內容或已簽章 XML,重用整形結果前需要更多驗證。
修復例之外保留最初的最小失敗例,分別測試名稱不匹配、交叉巢狀、屬性引號。虛構重現資料比大型正式文件更容易說明問題,也避免分享真實資料。