能否配置Saxon的Serializer生成Canonical XML?
解决Saxon Serializer不生成Canonical XML的问题
我之前也碰到过一模一样的困扰——Saxon默认的Serializer输出确实不符合Canonical XML规范,比如它会自动生成自闭合标签(像<element/>),但Canonical XML要求必须展开成<element></element>,还有不少格式细节都对不上。
其实Saxon本身是支持Canonical XML的,但不能通过普通的序列化属性来配置,得用它专门的Canonicalizer工具类来处理。下面是具体的实现思路和示例:
- 先初始化Saxon的
Processor实例,基于它创建Canonicalizer对象 - 可以指定要遵循的Canonical XML版本(比如1.0或1.1)
- 将需要规范化的XML节点(比如
XdmNode)传入canonicalize方法,就能得到符合规范的输出
举个Java代码的例子:
Processor processor = new Processor(false); // 指定使用Canonical XML 1.0规范,也可以换成CANONICAL_XML_1_1 Canonicalizer canonicalizer = processor.newCanonicalizer(Canonicalizer.CANONICAL_XML_1_0); // 假设你已经获取到了要处理的XdmNode对象 XdmNode targetNode = ...; ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); canonicalizer.canonicalize(targetNode, outputStream); // 最终得到的就是符合规范的Canonical XML字符串 String canonicalXml = outputStream.toString(StandardCharsets.UTF_8);
至于为什么普通Serializer没有对应的配置项?因为Saxon的序列化属性主要是控制常规XML的输出风格(缩进、换行、空格保留等),而Canonical XML是一套严格的标准化规则,需要独立的处理逻辑来逐字节符合规范,所以没有直接对应的序列化参数可以开启。
如果是在XSLT转换场景里,你也可以在转换完成后,用上述方法对结果节点做规范化处理,或者调用Saxon的扩展函数来触发规范化流程。
内容的提问来源于stack exchange,提问作者Jindřich Mynarz
相关产品推荐
相关产品推荐

