gpt4 book ai didi

java - 关闭 Saxon 输出到控制台

转载 作者:行者123 更新时间:2023-12-01 17:49:52 24 4
gpt4 key购买 nike

当我们使用 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 评估的情况下,这将是使用 Configuration 注册的 ErrorListener。您可以通过多种方式重定向此内容:

(a) 你可以编写自己的 ErrorListener 来执行它想要的任何操作(也许通过子类化标准错误监听器)

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

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

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

事后思考

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

关于java - 关闭 Saxon 输出到控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51572938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com