Saxonica PE 9.6.0.10遇无效XML字符报错仍返回0码,求无换许可证方案
问题
使用Saxon PE版本9.6.0.10的com.saxonica.ptree.StylesheetPackager生成分发用zip文件时,XML解析器会抛出SXXP0003错误(检测到如Unicode 0xf这类无效XML字符),但程序仍返回退出码0。失败时会生成一个无效的小型zip文件,不想通过判断文件大小来识别失败;该问题仅在Windows构建中出现,macOS下部分字符不会触发失败,且并非所有无效UTF-8字符都会触发异常(包括多字节无效字符)。现寻求无需更换许可证的解决方案。
可复现示例
test.xsl 文件内容
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xsl:transform [ <!ENTITY % entities SYSTEM "entities.dtd"> %entities; ]> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:template match=".*"> <html lang="en"> <body> kHello, world <!-- 此处包含Unicode 0xf字符 --> </body> </html> </xsl:template> </xsl:stylesheet>
test.sh 脚本内容
java -classpath saxon9pe.jar com.saxonica.ptree.StylesheetPackager test.xsl test.zip echo return code is $?
运行输出
Error on line 12 column 13 of test.xsl: SXXP0003: Error reported by XML parser: An invalid XML character (Unicode: 0xf) was found in the element content of the document. net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException; systemId: file:/Users/jholt/test/test.xsl; lineNumber: 12; columnNumber: 13; An invalid XML character (Unicode: 0xf) was found in the element content of the document. ... org.xml.sax.SAXParseException; systemId: file:/Users/jholt/test/test.xsl; lineNumber: 12; columnNumber: 13; An invalid XML character (Unicode: 0xf) was found in the element content of the document. ... at net.sf.saxon.Configuration.buildDocument(Configuration.java:3441) at com.saxonica.ptree.StylesheetPackager.archive(StylesheetPackager.java:65) at com.saxonica.ptree.StylesheetPackager.main(StylesheetPackager.java:152) return code is 0
无需更换许可证的解决方案
1. 预校验XSL文件的XML有效性
在调用StylesheetPackager之前,先用Saxon自带的XML解析能力校验XSL文件的合法性。可以编写一个简单的Java工具类,核心逻辑是调用net.sf.saxon.Configuration.buildDocument()方法加载XSL文件,捕获SAXParseException异常,若出现则返回非0退出码,避免执行打包流程。
2. 封装调用脚本捕获错误输出
修改现有脚本,捕获StylesheetPackager的标准错误输出,检测是否包含"SXXP0003"或"invalid XML character"这类错误关键字。如果检测到错误:
- 删除生成的无效zip文件
- 返回非0退出码
示例修改后的bash脚本:
#!/bin/bash java -classpath saxon9pe.jar com.saxonica.ptree.StylesheetPackager test.xsl test.zip 2>&1 | tee packager.log if grep -q "SXXP0003\|invalid XML character" packager.log; then rm -f test.zip exit 1 fi echo return code is $?
3. 预处理XSL文件过滤无效字符
对XSL文件进行预处理,移除或替换XML 1.0规范中不允许的字符(包括控制字符0x0-0x8、0xB-0xC、0xE-0x1F等)。可以用Python脚本批量处理,示例如下:
import re def clean_invalid_xml_chars(text): # 移除XML 1.0禁止的控制字符 return re.sub(r'[\x00-\x08\x0B\x0C\x0E-\x1F]', '', text) with open('test.xsl', 'r', encoding='utf-8') as f: content = f.read() cleaned_content = clean_invalid_xml_chars(content) with open('test_cleaned.xsl', 'w', encoding='utf-8') as f: f.write(cleaned_content)
之后使用清理后的test_cleaned.xsl进行打包。
内容的提问来源于stack exchange,提问作者Jeff Holt
相关产品推荐
相关产品推荐

