Saxon XQueryEvaluator.Evaluate返回TinyElementImpl而不是XdmNode

时间:2016-10-22 01:54:27

标签: c# xml performance xquery saxon

这是我的代码的简化版

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列表,但情况并非如此。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

看起来像个错误。我已将其记录在此处以采取行动:

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

从检查代码开始,在XdmValue是单例XdmItem的情况下,它看起来好像GetList()是错误的。因此,在我们生成修复程序之前,您可以通过测试XdmValue.Count并以不同方式处理单例情形来解决此问题。