【问题标题】:Saxon HE XQuery process nodes in document throwing error about BaseUriSaxon HE XQuery 进程节点在文档中抛出关于 BaseUri 的错误
【发布时间】:2019-12-25 03:00:20
【问题描述】:

我正在尝试使用来自 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/"; 行,我会得到同样的错误。

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

知道为什么会发生这种情况吗?对此的任何帮助将不胜感激。

【问题讨论】:

  • 您能否向我们展示一个最小但完整的示例,以便我们重现该问题? Xquery代码看起来如何,输入字符串如何?
  • @MartinHonnen 感谢您的回复。我在问题中添加了这些信息 - XQuery 和输入 XML 字符串。
  • 你把文件books.xml放在哪里了?为什么您尝试设置ContextItem,但在XQuery 中不使用上下文项.,或者您为什么不简单地使用路径for $x in /bookstore/book?我认为您会收到错误,因为 doc("books.xml") 失败。当然,如果你想直接从服务器加载文件,那么你可以使用doc('https://www.w3schools.com/xml/books.xml')

标签: c# xml xml-parsing xquery saxon


【解决方案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 函数调用。

【讨论】:

    【解决方案2】:

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

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

    如果位置file:///C:/temp/ 不存在,那么我可以看到事情变得更加混乱;也许我们应该在这种情况下产生更好的诊断。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      相关资源
      最近更新 更多