关闭撒克逊输出到控制台
Turn off Saxon output to console
当我们使用 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 日志中。这些可能是一个文件,但它们可以是很多其他东西,我们希望它转到用户配置的任何日志侦听器。
有办法吗?
这些消息被发送到已注册的 ErrorListener
,调用它的 warning()
方法。在独立的 XPath 计算的情况下,这将是 ErrorListener
注册到 Configuration
。您可以通过多种方式重定向:
(a) 你可以编写自己的 ErrorListener
来做任何它想做的事情(也许通过子类化标准的)
(b) 您可以让 StandardErrorListener
注册到 Configuration
并调用其 setLogger()
方法将其输出重定向到您自己的 net.sf.saxon.lib.Logger
实现(也许调用 log4j 的一个)。
(c) 您可以继续使用 StandardErrorListener
使用的 StandardLogger
,但将其输出重定向到不同的 PrintStream
.
不幸的是,虽然 XSLT 和 XQuery 允许在单个转换或查询级别对此进行控制,但对于独立的 XPath,它必须是配置范围的。
事后思考
我应该提到这些特定的警告也可以使用配置选项 FeatureKeys.SUPPRESS_XPATH_WARNINGS
来抑制
这是一个示例实现,自 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());
当我们使用 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 日志中。这些可能是一个文件,但它们可以是很多其他东西,我们希望它转到用户配置的任何日志侦听器。
有办法吗?
这些消息被发送到已注册的 ErrorListener
,调用它的 warning()
方法。在独立的 XPath 计算的情况下,这将是 ErrorListener
注册到 Configuration
。您可以通过多种方式重定向:
(a) 你可以编写自己的 ErrorListener
来做任何它想做的事情(也许通过子类化标准的)
(b) 您可以让 StandardErrorListener
注册到 Configuration
并调用其 setLogger()
方法将其输出重定向到您自己的 net.sf.saxon.lib.Logger
实现(也许调用 log4j 的一个)。
(c) 您可以继续使用 StandardErrorListener
使用的 StandardLogger
,但将其输出重定向到不同的 PrintStream
.
不幸的是,虽然 XSLT 和 XQuery 允许在单个转换或查询级别对此进行控制,但对于独立的 XPath,它必须是配置范围的。
事后思考
我应该提到这些特定的警告也可以使用配置选项 FeatureKeys.SUPPRESS_XPATH_WARNINGS
这是一个示例实现,自 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());