【问题标题】:Turn off Saxon output to console关闭撒克逊输出到控制台
【发布时间】:2019-01-05 11:06:32
【问题描述】:

当我们使用 Saxon 时,有时会向控制台输出如下:

第 2 行第 6 列的警告 在 {\n\t\t\t\ttrue\n\t\t\t\tBest} 中: 表达式正在寻找一个名为 'true' 的子元素 - 也许 true() 是 故意的?要避免此警告,请使用 child::true 或 ./true。 第 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 日志中。这些可能是一个文件,但它们可以是很多其他的东西,我们希望它转到用户配置的任何日志监听器。

有没有办法做到这一点?

【问题讨论】:

  • 错误 ATE-1221(内部注释)
  • 那么你如何使用Saxon,我想你需要分享相关代码,以便其他人就如何重定向消息提出建议。当然,那里的特定警告会告诉您如何避免它。 saxonica.com/html/documentation/configuration/…STANDARD_­ERROR_­OUTPUT_­FILE 列为配置实例
  • @MartinHonnen - 我添加了上面的代码。提供文件名对我们来说效果不佳,因为我们想将这些警告发送到可能不是文件的 log4j/log4net 流。

标签: java .net saxon


【解决方案1】:

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

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

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

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

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

事后考虑

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

【讨论】:

  • 能否请您指出一个如何实现选项 a 或 b 的示例?我想我可以将消息发送到我们的 log4j 记录器。谢谢 - 戴夫
【解决方案2】:

这是一个示例实现,自 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());

【讨论】:

    猜你喜欢
    • 2016-01-25
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多