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,重用整形结果前需要更多验证。

修复例之外保留最初的最小失败例,分别测试名称不匹配、交叉嵌套、属性引号。虚构复现数据比大型生产文档更容易说明问题,也避免共享真实资料。

参考资料

使用工具

指南 →