数据格式与结构化数据
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,重用整形结果前需要更多验证。
修复例之外保留最初的最小失败例,分别测试名称不匹配、交叉嵌套、属性引号。虚构复现数据比大型生产文档更容易说明问题,也避免共享真实资料。