为了账号安全,请及时绑定邮箱和手机立即绑定

关闭 Saxon 输出到控制台

关闭 Saxon 输出到控制台

拉丁的传说 2021-06-10 10:08:30
当我们使用 Saxon 时,我们有时会在控制台上得到输出,例如:{\n\t\t\t\t\ttrue\n\t\t\t\tBest} 中第 2 行第 6 列的警告:表达式正在寻找名为“true”的子元素 - 可能是 true() 的意图?要避免此警告,请使用 child::true 或 ./true。{... Alternatives} 中第 2 行第 6 列的警告:表达式正在寻找名为“false”的子元素 - 可能是 false() 的意图?要避免此警告,请使用 child::false 或 ./false。有没有办法关闭它?有没有办法将它提供给我们正在使用的 log4j/log4net 实例?我们创建一个编译器如下(我们在代码中执行 XPath 2.0 查询 - Java & .NET):XMLReader reader = XMLReaderFactory.createXMLReader();InputSource xmlSource = new InputSource(xmlData);SAXSource saxSource = new SAXSource(reader, xmlSource);Source schemaSource = new StreamSource(schemaFile);Configuration config = createEnterpriseConfiguration();config.addSchemaSource(schemaSource);Processor processor = new Processor(config);SchemaValidator validator = new SchemaValidatorImpl(processor);DocumentBuilder doc_builder = processor.newDocumentBuilder();if (!preserveWhiteSpace)    doc_builder.setWhitespaceStrippingPolicy(WhitespaceStrippingPolicy.ALL);doc_builder.setSchemaValidator(validator);XdmNode root_node = doc_builder.build(saxSource);XPathCompiler compiler = processor.newXPathCompiler();compiler.setSchemaAware(true);我无法提供日志文件名,因为我们希望它位于我们正在创建的 log4j/log4net 日志中。这些可能是一个文件,但它们可以是很多其他东西,我们希望它转到用户配置的任何日志侦听器。有没有办法做到这一点?
查看完整描述

2 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

这些消息被发送到注册的ErrorListener,调用它的warning()方法。在独立 XPath 评估的情况下,这将是ErrorListener注册到Configuration. 您可以通过多种方式重定向:

(a) 你可以自己写ErrorListener任何它想做的事情(也许是通过继承标准的)

(b) 您可以使用StandardErrorListener注册Configuration并调用其setLogger()方法将其输出重定向到您自己的实现net.sf.saxon.lib.Logger(可能是调用 log4j 的实现)。

(c) 您可以继续使用StandardLogger, 使用的 ,StandardErrorListener但将其输出重定向到不同的PrintStream.

不幸的是,虽然 XSLT 和 XQuery 允许在单个转换或查询级别进行控制,但对于独立的 XPath,它必须是配置范围的。

事后

我应该提到这些特定的警告也可以使用配置选项来抑制 FeatureKeys.SUPPRESS_XPATH_WARNINGS


查看完整回答
反对 回复 2021-06-17
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

这是一个示例实现,自 Saxon 9.9.0-1 起有效:定义一个NullErrorListener:


import javax.xml.transform.ErrorListener;

import javax.xml.transform.TransformerException;


/** Does nothing on errors (especially, does not log) */

public class NullErrorListener implements ErrorListener {

    @Override public void warning(TransformerException e) throws TransformerException { }

    @Override public void error(TransformerException e) throws TransformerException { }

    @Override public void fatalError(TransformerException e) throws TransformerException { }

}

设置这个 ErrorListener 是通过以下方式完成的:


Processor processor = new Processor(false);

processor.setConfigurationProperty(net.sf.saxon.lib.Feature.ERROR_LISTENER_CLASS,

                                   NullErrorListener.class.getName());


查看完整回答
反对 回复 2021-06-17
  • 2 回答
  • 0 关注
  • 111 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信