如果 XML 常在上線後出問題,先看這篇
你可能遇過這些情況:
- 本地看起來正常,上線卻被下游系統拒收
- 只有少數檔案失敗,但足以造成部署回滾
- 能 parse,不代表符合協議結構
這篇教學的目標是:給你一條可以直接落地的 XML 驗證流程。
5 分鐘版結論
照這個順序做,最穩定:
- 先做 語法驗證
- 再做 XSD 或 DTD(二選一)
- 發版前做 批次驗證
- CI 以 錯誤碼 阻斷,不只看報錯文字
直接開始: 打開 XML 驗證工具
第一步:先清掉語法錯誤
不要一開始就上 XSD/DTD。語法錯誤沒處理,後面錯誤訊息會很吵。
常見例子:
<order>
<item>Apple</item>
<total>12.5</total>
</orders>
這是根標籤開閉不一致(order vs orders)。
第二步:XSD 與 DTD 怎麼選
選 XSD 的時機
- 要求型別嚴格(如 decimal、date)
- 要求順序與出現次數
- 需要命名空間控制
選 DTD 的時機
- 維護舊有 XML 合約
- 需要輕量宣告式規則
目前 DTD 驗證可涵蓋:
- ELEMENT 模型(序列/選擇/重複、EMPTY、ANY、mixed)
- ATTLIST 屬性約束(
#REQUIRED、#FIXED、枚舉) - 內部 ENTITY 引用解析
範例:
<!ENTITY cat "cooking">
<!ELEMENT bookstore (book+)>
<!ELEMENT book (title,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST book category (cooking|children) #REQUIRED>
第三步:批次驗證一定要做
單檔通過不代表可上線。真正踩坑常在「大部分通過、少數失敗」。
發版前建議固定做:
- 全量待發布檔案一起驗
- 保留逐檔錯誤明細
- 任一失敗即阻斷(fail-fast)
第四步:API 接入 CI/CD
單檔接口
curl -X POST https://www.ilovedevtool.com/api/xml/validate \
-H "Content-Type: application/json" \
-d '{
"xml": "<order><item>Apple</item><total>12.5</total></order>",
"xsd": "<xs:schema .../>"
}'
批次接口
curl -X POST https://www.ilovedevtool.com/api/xml/validate/jobs \
-H "Content-Type: application/json" \
-d '{
"files": [
{"fileName":"a.xml","xml":"<order>...</order>","xsd":"<xs:schema .../>"},
{"fileName":"b.xml","xml":"<bookstore>...</bookstore>","dtd":"<!ELEMENT bookstore ...>"}
],
"options": {"outputFormat":"all"}
}'
注意:同一檔案項目建議 xsd 與 dtd 二選一。
建議接入 CI 的錯誤碼
XML_INVALIDXSD_INVALIDSCHEMA_MISMATCHDTD_INVALIDDTD_MISMATCHPAYLOAD_TOO_LARGE
重點:
- 文案適合人工排查
- 錯誤碼適合自動化判斷
常見誤區
- 以為「可解析」就等於「符合協議」
- 忽略少量失敗樣本
- 團隊沒有統一 XSD/DTD 使用規範
- 測試樣本含敏感資料未脫敏
上線前檢查清單(可直接貼 PR)
- 語法驗證通過
- XSD 或 DTD 驗證通過(同檔案只選一種)
- 批次驗證通過(
failed = 0) - CI 使用錯誤碼阻斷
- 關鍵報文樣本已納入回歸
下一步怎麼做
不需要一次做到 100 分。先把語法 + 單檔結構驗證跑順,再接批次與 CI。