文档中的 Saxon HE XQuery 进程节点抛出有关 BaseUri 的错误
Saxon HE XQuery process nodes in document throwing error about BaseUri
我正在尝试使用 C# 中的 Saxon HE 和 XQuery 处理器来处理输入 XML 文档,如下所示(输入文档为 req.XML
,XQuery 字符串为 req.XQuery
):
Processor processor = new Processor();
var documentBuilder = processor.NewDocumentBuilder();
documentBuilder.BaseUri = new Uri("file://");
var xdmNode = documentBuilder.Build(new StringReader(req.XML));
XQueryCompiler compiler = processor.NewXQueryCompiler();
compiler.BaseUri = "file:///C:/temp/";
compiler.DeclareNamespace("saxon", "http://saxon.sf.net/");
XQueryExecutable exp = compiler.Compile(req.XQuery);
XQueryEvaluator eval = exp.Load();
eval.ContextItem = xdmNode;
var results = new XdmDestination();
eval.Run(results);
XmlXQueryResponse output = new XmlXQueryResponse();
output.XMLResult = results.XdmNode.OuterXml;
这是我正在测试的 XQuery 查询:
for $x in doc("books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title
这是我正在测试的 XML 文件:https://www.w3schools.com/xml/books.xml
然而,当我运行这个时,我得到以下错误:
Saxon.Api.DynamicError: 'Exception thrown by URIResolver'
此错误由行 eval.Run(results)
.
抛出
如果我删除行 compiler.BaseUri = "file:///C:/temp/";
我会得到同样的错误。
我很难理解为什么它会抱怨 BaseUri,因为我是 Saxon HE 的新手。
知道为什么会这样吗?如有任何帮助,我们将不胜感激。
如果你想从服务器加载文件使用
for $x in doc("https://www.w3schools.com/xml/books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title
https://xqueryfiddle.liberty-development.net/eiZQaEM
对于您的查询,如果您自己使用 DocumentBuilder 解析 XML 并将其设置为上下文项,您可以只使用 for $x in /bookstore/book
,不需要 doc
函数调用。
如果文件确实存在于 file:///C:/temp/books.xml
,那么我希望您的代码能够成功。
如果文件在该位置不存在,那么我会期待一个不同的错误:FODC0005 或 FODC0002 明确告诉您文件未找到。
如果位置 file:///C:/temp/
不存在,那么我会看到事情变得更加混乱;在这种情况下,也许我们应该做出更好的诊断。
但是,您没有提供足够的信息让我们判断哪些情况适用。
我正在尝试使用 C# 中的 Saxon HE 和 XQuery 处理器来处理输入 XML 文档,如下所示(输入文档为 req.XML
,XQuery 字符串为 req.XQuery
):
Processor processor = new Processor();
var documentBuilder = processor.NewDocumentBuilder();
documentBuilder.BaseUri = new Uri("file://");
var xdmNode = documentBuilder.Build(new StringReader(req.XML));
XQueryCompiler compiler = processor.NewXQueryCompiler();
compiler.BaseUri = "file:///C:/temp/";
compiler.DeclareNamespace("saxon", "http://saxon.sf.net/");
XQueryExecutable exp = compiler.Compile(req.XQuery);
XQueryEvaluator eval = exp.Load();
eval.ContextItem = xdmNode;
var results = new XdmDestination();
eval.Run(results);
XmlXQueryResponse output = new XmlXQueryResponse();
output.XMLResult = results.XdmNode.OuterXml;
这是我正在测试的 XQuery 查询:
for $x in doc("books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title
这是我正在测试的 XML 文件:https://www.w3schools.com/xml/books.xml
然而,当我运行这个时,我得到以下错误:
Saxon.Api.DynamicError: 'Exception thrown by URIResolver'
此错误由行 eval.Run(results)
.
如果我删除行 compiler.BaseUri = "file:///C:/temp/";
我会得到同样的错误。
我很难理解为什么它会抱怨 BaseUri,因为我是 Saxon HE 的新手。
知道为什么会这样吗?如有任何帮助,我们将不胜感激。
如果你想从服务器加载文件使用
for $x in doc("https://www.w3schools.com/xml/books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title
https://xqueryfiddle.liberty-development.net/eiZQaEM
对于您的查询,如果您自己使用 DocumentBuilder 解析 XML 并将其设置为上下文项,您可以只使用 for $x in /bookstore/book
,不需要 doc
函数调用。
如果文件确实存在于 file:///C:/temp/books.xml
,那么我希望您的代码能够成功。
如果文件在该位置不存在,那么我会期待一个不同的错误:FODC0005 或 FODC0002 明确告诉您文件未找到。
如果位置 file:///C:/temp/
不存在,那么我会看到事情变得更加混乱;在这种情况下,也许我们应该做出更好的诊断。
但是,您没有提供足够的信息让我们判断哪些情况适用。