关闭Saxon输出到控制台

时间:2018-07-28 15:53:07

标签: java .net saxon

当我们使用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日志中。这些可能是一个文件,但是它们可能还有很多其他的东西,我们希望它可以转到用户配置的所有日志侦听器。

有办法吗?

2 个答案:

答案 0 :(得分:2)

这些消息被发送到已注册的ErrorListener,调用其warning()方法。对于独立的XPath评估,这将是向ErrorListener注册的Configuration。您可以通过几种方式重定向它:

(a)您可以编写自己的ErrorListener来完成所需的任何操作(也许可以通过将标准类子类化)

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

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

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

AFTERTHOUGHT

我应该提到,使用配置选项FeatureKeys.SUPPRESS_XPATH_WARNINGS

也可以禁止这些特定的警告

答案 1 :(得分:1)

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