Saxon HE XQuery处理节点中有关BaseUri的文件引发错误

问题描述 投票:0回答:2

我正在尝试使用来自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:'URIResolver引发的异常'

此错误由eval.Run(results)行引发。

如果删除行compiler.BaseUri = "file:///C:/temp/";,则会出现相同的错误。

由于我是Saxon HE的新手,所以我很难理解为什么它抱怨BaseUri。

知道为什么会这样吗?任何帮助,将不胜感激。

c# xml xml-parsing xquery saxon
2个回答
1
投票

如果要从服务器加载文件,请使用

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函数调用。


0
投票

如果文件实际存在于file:///C:/temp/books.xml,那么我希望您的代码成功。

如果该位置不存在该文件,那么我会想到一个不同的错误:FODC0005或FODC0002清楚地告诉您该文件未找到。

如果位置file:///C:/temp/不存在,那么我会发现事情变得更加混乱;在这种情况下,也许我们应该做出更好的诊断。

但是,您没有提供足够的信息让我们知道哪些情况适用。

© www.soinside.com 2019 - 2024. All rights reserved.