当我们使用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实例?
我们按如下方式创建一个编译器(我们正在用代码Java和.NET进行XPath 2.0查询):
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
来执行所需的任何操作(也许可以通过将标准的cc子类化)
(b)您可以在StandardErrorListener
中注册Configuration
并调用其setLogger()
方法,以将其输出重定向到您自己的net.sf.saxon.lib.Logger
实现(也许是调用log4j的实现)。
(c)您可以继续使用StandardLogger
,由StandardErrorListener
使用,但将其输出重定向到其他PrintStream
。
不幸的是,尽管XSLT和XQuery允许在单个转换或查询级别进行控制,但对于独立的XPath,它必须在整个配置范围内。
敬意
我应该提到,也可以使用配置选项FeatureKeys.SUPPRESS_XPATH_WARNINGS
禁止显示这些特定的警告。