【问题标题】:Saxon XQueryEvaluator.Evaluate returns TinyElementImpl instead of XdmNodeSaxon XQueryEvaluator.Evaluate 返回 TinyElementImpl 而不是 XdmNode
【发布时间】:2016-10-22 01:54:27
【问题描述】:

这是我的代码的简化版本

Processor processor = new Processor();
DocumentBuilder documentBuilder = processor.NewDocumentBuilder();
documentBuilder.IsLineNumbering = true;
documentBuilder.WhitespacePolicy = WhitespacePolicy.PreserveAll;
XQueryCompiler compiler = processor.NewXQueryCompiler();
string query = BuildXqueryString();

if (!String.IsNullOrEmpty(query))
{
    XQueryExecutable executable = compiler.Compile(query);
    XQueryEvaluator evaluator = executable.Load();
    evaluator.ContextItem = documentBuilder.Build(xmlNode);
    var evaluations = evaluator.Evaluate();

    foreach (var evaluation in evaluations)
       runEvaluation((XdmNode)evaluation, document);
}

这就是我现在所拥有的,它按预期工作。现在我们正在做一些更改以并行化评估,并且我在修改最后一个 foreach 以将其更改为 Parallel.ForEach 时遇到问题。这是我替换 foreach 的新代码:

List<XdmNode> evaluationsAsList = evaluations.GetList().Cast<XdmNode().ToList();

Parallel.ForEach(evaluationsAsList, evaluation =>
   runEvaluation(evaluation, document)
);

此代码失败,因为GetList() 向我返回了net.sf.saxon.tree.tiny.TinyElementImpl 的列表,而不是Saxon.Api.XdmNode。根据文档,GetList() 应始终至少返回一个 Saxon.Api.XdmItem 列表,但事实并非如此。

有什么想法吗?

【问题讨论】:

  • 嗨,我正在尝试重现此问题,但遇到以下问题: List evaluationsAsList = evaluations.GetList().Cast
  • 这只是一个尝试获取XdmNode 列表的测试,我不确定这是否应该是正确的方法。我想要实现的是在Parallel.ForEach 中使用evaluator.Evaluate() 的结果

标签: c# xml performance xquery saxon


【解决方案1】:

看起来像一个错误。我已将其记录在这里以供操作:

https://saxonica.plan.io/issues/3006

通过检查代码,在我看来 GetList() 在 XdmValue 是单例 XdmItem 的情况下是错误的。因此,在我们做出修复之前,您可以通过测试 XdmValue.Count 并以不同方式处理单例情况来解决该问题。

【讨论】:

  • 对不起,你用不同的方式处理单例是什么意思?
  • 类似if (evaluations instanceof XdmNode) then runEvaluations(((XdmNode)evaluations) else ((your current code))
  • 错误现已修复。补丁将在下一个维护版本中提供。
猜你喜欢
  • 2017-06-28
  • 2018-05-04
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
相关资源
最近更新 更多