关闭Saxon输出到控制台

问题描述 投票:0回答:2

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

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

有没有办法做到这一点?

java .net saxon
2个回答
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,它必须是配置范围的。

事后

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


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());
© www.soinside.com 2019 - 2024. All rights reserved.