如何移除SaxonC-HE输出至stderr的错误与警告信息?
解决SaxonC-HE错误/警告输出到stderr的问题
要阻止SaxonC-HE将错误和警告输出到stderr(即便已捕获SaxonApiException),可以通过以下两种可靠方法实现:
方法一:自定义错误监听器(推荐)
SaxonC允许通过设置自定义ErrorListener来接管错误/警告的处理逻辑,完全控制是否输出到stderr。以Python绑定为例:
from saxonc import * class SilentErrorListener(ErrorListener): def warning(self, exception): # 忽略警告,不输出到stderr pass def error(self, exception): # 忽略普通错误,如需自定义日志可在此添加逻辑 pass def fatalError(self, exception): # 致命错误可按需处理,此处选择不输出 pass # 初始化处理器并应用自定义监听器 with PySaxonProcessor(license=False) as proc: xslt_processor = proc.new_xslt30_processor() xslt_processor.set_error_listener(SilentErrorListener()) try: # 执行你的XSLT转换或XQuery操作 result = xslt_processor.transform_to_string(source_file="input.xml", stylesheet_file="transform.xsl") except SaxonApiException as e: # 在这里处理捕获到的异常,比如写入自定义日志 print(f"处理失败: {e.message}")
其他语言绑定(如Java、C#)的逻辑类似:只需实现对应语言的ErrorListener/IErrorListener接口,覆盖相关方法并空实现即可。
方法二:临时重定向stderr(快速解决)
如果不需要精细控制,可临时将stderr重定向到空缓冲区,执行完Saxon操作后再恢复原始流。同样以Python为例:
import sys from io import StringIO from saxonc import * # 保存原始stderr流 original_stderr = sys.stderr try: # 将stderr重定向到内存缓冲区(不输出到控制台/日志文件) sys.stderr = StringIO() with PySaxonProcessor(license=False) as proc: xslt_processor = proc.new_xslt30_processor() try: result = xslt_processor.transform_to_string(source_file="input.xml", stylesheet_file="transform.xsl") except SaxonApiException as e: print(f"处理失败: {e.message}") finally: # 恢复原始stderr流,避免影响后续代码 sys.stderr = original_stderr
注意事项
- 自定义错误监听器更优雅,能精准区分Saxon的错误类型并按需处理,不会影响其他程序的stderr输出。
- 重定向stderr的方法较为粗暴,会屏蔽所有输出到stderr的内容,包括非Saxon产生的信息,需谨慎使用。
内容的提问来源于stack exchange,提问作者Jerome Guillaume
相关产品推荐
相关产品推荐

