2016-10-22 3 views
0

を返すこれが私のコードの簡易版サクソンXQueryEvaluator.EvaluateがTinyElementImpl代わりのXdmNode

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に変更する問題があります。 GetList()は私にnet.sf.saxon.tree.tiny.TinyElementImpl代わりのSaxon.Api.XdmNodeのリストを返しているので、

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

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

このコードは失敗します。これは、foreachのを交換する私の新しいコードです。ドキュメントGetList()によれば、常に少なくともSaxon.Api.XdmItemのリストを返すべきであり、そうでない場合もあります。

アイデア?

+0

こんにちは、これを再現しようとしていますが、次のような問題があります。リスト evaluateationsAsList = evaluate.GetList()。Cast ond1

+0

これはちょうど 'XdmNode'のリストを取得しようとするテストでしたが、正しいアプローチでなければならないかどうかはわかりません。私が達成したいのは、 'Evaluator.Evaluate()'の結果を 'Parallel.ForEach'の中で使うことです。 – Ricardo

答えて

0

バグのようです。私はアクションのためにそれをここに記録されました:GetListのは()XdmValueがシングルトンXdmItemである場合には間違っているかのように

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

コードを検査するから、それは私には見えます。ですから、修正を行うまでは、XdmValue.Countをテストし、シングルトンケースを別の方法で処理することで、この問題を回避することができます。

+0

申し訳ありませんが、シングルトンのケースを別の方法で扱うのはどういう意味ですか? – Ricardo

+0

'(評価インスタンスXdmNode)then runEvaluations((XdmNode)評価)else((現在のコード))' –

+0

バグが修正されました。次回のメンテナンスリリースでパッチが利用可能になります。 – ond1