SheepDev

資料格式與結構化資料

XML 無法解析,如何檢查標籤與字元參照?

使用工具

匯入 XML 時末行報錯,補上結束標籤又在別處失敗。不妨縮小為一筆紀錄,追蹤每個元素的開始與結束。解析器發現問題的位置不一定就是最初寫錯的位置。

在 XML 整形工具中使用虛構訂單。放回應用前檢查編號、名稱、金額是否仍符合預期,無需真實客戶資料或憑證。縮排清楚不代表訂單內容或接收端規格也正確。

先配對名稱,再補標籤

結束標籤不匹配
<order id="A-17"><name>Notebook</title><amount>1200</amount></order>

元素以 name 開始卻以 title 結束,執行應失敗。先查這個不匹配,不要先改最後的 order。不要從 Notebook 的意思猜欄位名,應確認接收格式要求 name 還是 title,再統一兩端。

統一為 name 的輸入
<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 &amp; Paper</name><note>count &lt; 10</note></order>

Pen & Paper 中的 & 用 &amp;,count < 10 中的小於號用 &lt;。這是改變 XML 表示,不是商品名。應區分解碼後的值與 XML 原始碼中的寫法。

對已編碼文件全域替換 &,會把 &amp; 變為 &amp;amp;,接收端可能得到字面 &amp;。原始文字編碼與處理成品 XML 應分開。整形輸出保留字元參照不一定異常,這不是欄位值的 HTML 顯示。

屬性引號也是值的邊界

屬性內引號的表示
<item code="A-17" note="Use &quot;small&quot; size"><name>Notebook</name></item>

note 用雙引號包圍,內部雙引號寫作 &quot;。提早結束值會讓後文看起來像另一個屬性。單字值正常不代表邊界正常,可分別用含空白、&、引號的虛構值測試。

工具依內部解析器的支援行為檢查語法,並非證明所有 XML 相容條件。不要認為 HTML 的無值屬性也適用於 XML。工具接受不保證接收端接受,仍需檢查對方輸入規格並實際驗證。

金額為空,標籤也可以正確

把 1200 改成空值或 twelve,標籤匹配時仍可能整形成功。語法無法決定金額是否必填、是否必須數字或使用哪種貨幣。把結構檢查與業務欄位驗證分開,才知道確認了什麼。

本頁面不依 XSD 驗證訂單,也不提交接收端。DTD 與實體宣告會被拒絕而非載入。為了通過而刪除 DOCTYPE 可能改變含義,應在合適的安全環境檢查依賴。

交付修正時保留值與結構證據

說明哪些標籤配對、哪些字元逸出,而不只是「整形成功」。檢查 A-17、Notebook、1200,再用含 & 的名稱重複檢查。空白有意義的混合內容或已簽章 XML,重用整形結果前需要更多驗證。

修復例之外保留最初的最小失敗例,分別測試名稱不匹配、交叉巢狀、屬性引號。虛構重現資料比大型正式文件更容易說明問題,也避免分享真實資料。

參考資料

使用工具

指南 →