Bug #6049
closedDoes XQueryEvaluator for SaxonCS lack the API to set an ErrorReporter?
100%
Description
In https://saxonica.plan.io/boards/3/topics/9430?r=9432#message-9432 I commented on spurious console error output by SaxonCS while I thought my GUI program caught any SaxonApiExceptions. I managed to prevent lots of those console error outputs by using an ErrorReporter on XsltCompiler, XQueryCompiler and Xslt30Transformer.
However, for XQueryEvaluator in the SaxonCS API, that option seems to be missing and as a result code like
using Saxon.Api;
namespace SaxonCSXQueryEvaluatorLackOfErrorReporter
{
internal class Program
{
static void Main(string[] args)
{
var processor = new Processor();
var xqueryCompiler = processor.NewXQueryCompiler();
var errorList = new List<string>();
xqueryCompiler.ErrorReporter = error => errorList.Add($"{error.Message} {error.Location.LineNumber}:{error.Location.ColumnNumber}");
XQueryExecutable xqueryExecutable = null;
try
{
xqueryExecutable = xqueryCompiler.Compile(".");
}
catch (SaxonApiException e)
{
Console.WriteLine($"XQuery compilation failed: {e.Message}\n{string.Join('\n', errorList)}");
return;
}
var xqueryEvaluator = xqueryExecutable.Load();
try
{
using var resultWriter = new StringWriter();
xqueryEvaluator.Run(processor.NewSerializer(resultWriter));
Console.WriteLine(resultWriter.ToString());
}
catch (SaxonApiException e)
{
Console.WriteLine($"XQuery evaluation failed: {e.Message}\n{string.Join('\n', errorList)}");
}
}
}
}
outputs both the Console.WriteLine($"XQuery evaluation failed: {e.Message}\n{string.Join('\n', errorList)}");
as well as SaxonCS internal Console.Err output e.g.
Error on line 1 column 2
XPDY0002 The context item is absent
XQuery evaluation failed: The context item is absent
For a Java program along the same lines I see similar output but there XQueryEvaluator allows me to set an ErrorReporter e.g.
package org.example;
import net.sf.saxon.s9api.*;
import java.io.StringWriter;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
Processor processor = new Processor();
XQueryCompiler xqueryCompiler = processor.newXQueryCompiler();
ArrayList<String> errorList = new ArrayList<>();
xqueryCompiler.setErrorReporter(xmlProcessingError -> errorList.add(xmlProcessingError.getMessage() + " " + xmlProcessingError.getLocation().getLineNumber() + ":" + xmlProcessingError.getLocation().getColumnNumber()));
XQueryExecutable xqueryExecutable = null;
try {
xqueryExecutable = xqueryCompiler.compile(".");
}
catch (SaxonApiException e) {
System.out.println("XQuery compilation failed: " + e.getMessage() + "\n" + errorList);
return;
}
XQueryEvaluator xqueryEvaluator = xqueryExecutable.load();
errorList.clear();
xqueryEvaluator.setErrorReporter(xmlProcessingError -> errorList.add(xmlProcessingError.getMessage() + " " + xmlProcessingError.getLocation().getLineNumber() + ":" + xmlProcessingError.getLocation().getColumnNumber()));
try {
StringWriter resultWriter = new StringWriter();
xqueryEvaluator.run(processor.newSerializer(resultWriter));
}
catch (SaxonApiException e) {
System.out.println("XQuery evaluation failed: " + e.getMessage() + "\n" + errorList);
}
}
}
and then Saxon's internal output to System.err is prevented.
That suggests SaxonCS somehow lacks the option/API to set an ErrorReporter on XQueryEvaluator.
Or is there a different way for SaxonCS to prevent the Console.Err output and handle any errors with program code?
Please register to edit this issue