使用xml-crypto执行Exclusive Canonicalization后结果异常如何修正?
问题解决:xml-crypto 规范XML时的格式问题
问题描述
使用xml-crypto的ExclusiveCanonicalization执行W3C Exclusive Canonicalization专属规范化时,出现两个格式问题:
- 规范化后的XML被空标签
<></>包裹,格式为<>..myxml..</> - 空格格式不符合预期,与预规范化的XML(截图左侧红色内容)差异明显,实际生成结果(截图右侧绿色内容)空格处理不符合要求
使用代码:
const ExclusiveCanonicalization = require('xml-crypto/lib/exclusive-canonicalization').ExclusiveCanonicalization; const canonicalization = new ExclusiveCanonicalization(); const canonical = canonicalization.process(xmlRequestDOMDoc).toString()
解决方案
1. 移除空标签包裹
问题原因是传入process方法的是整个DOM文档对象,而非XML的根元素节点。xml-crypto处理文档对象时,会额外生成空标签包裹根元素。
修改代码,传入根元素节点:
// 提取DOM文档的根元素 const rootElement = xmlRequestDOMDoc.documentElement; const canonical = canonicalization.process(rootElement).toString();
2. 修正空格格式问题
XML规范化的空格处理遵循W3C规范,要匹配预规范化的空格表现,需注意两点:
- 解析XML时保留原始空格:如果
xmlRequestDOMDoc是通过解析XML字符串得到的,解析时要开启保留空格配置。以xmldom为例:const { DOMParser } = require('xmldom'); const parser = new DOMParser({ preserveWhitespace: true }); const xmlRequestDOMDoc = parser.parseFromString(xmlString, 'text/xml'); - 规范化时使用默认配置:
ExclusiveCanonicalization的默认配置已符合W3C规范,若之前修改过配置,需恢复默认:// 默认配置即可满足规范要求 const canonicalization = new ExclusiveCanonicalization();
若调整后仍有差异,需确认预期结果是否严格符合Exclusive Canonicalization标准——若预期结果包含不符合规范的自定义空格格式,不建议强行修改,否则会破坏规范化的标准性。
内容的提问来源于stack exchange,提问作者Damjan
相关产品推荐
相关产品推荐

