首页 > 解决方案 > 关闭撒克逊输出到控制台

问题描述

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

{\n\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 日志中。这些可能是一个文件,但它们可以是很多其他的东西,我们希望它转到用户配置的任何日志监听器。

有没有办法做到这一点?

标签: java.netsaxon

解决方案


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

(a)您可以编写自己的ErrorListener代码来做它想做的任何事情(也许通过继承标准的)

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

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

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

深思熟虑

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


推荐阅读