各ノードの時間に基づいて XML ドキュメントのノードをソートする C# .NET アプリで問題が発生しています。私の問題は、並べ替えが行われる項目を指定する XPathExpression を適切に構築する方法がわからないことだと思います。
XML には、各ジョブの名前、実行ステータス、開始時刻、終了時刻など、実行されたバッチ ジョブに関する情報が含まれています。
私の XML ドキュメントは次の形式です。
<results>
<result>
(Info on one job)
</result>
</results>
単一のジョブの結果ノードの例を次に示します。
<result offset='14'>
<field k='job_name'>
<value h='1'><text>Y_RUNNING_3</text></value>
</field>
<field k='job_did_start'>
<value><text>08-01-2012 04:00:00</text></value>
</field>
</result>
いくつかの無関係なフィールドの値を省略しました。各フィールドには「フィールド」という名前が付けられ、属性「k」を使用して指定されたフィールドの名前が付けられます。(XML フォーマットは私が設計したものではありません。)
私のコードでは、XPathDocument と XPathNavigator を使用して、並べ替えずに XML ドキュメントを読み込むことに成功しています。ただし、「k」属性が「job_did_start」に設定されたフィールドの値でノードをソートする必要があります。
コードの一部を次に示します。
XPathDocument doc = new XPathDocument(strFilepath);
XPathNavigator nav = doc.CreateNavigator();
XPathExpression selectExpression = nav.Compile("/results/result"); // QQQ not sure about this
// XPathExpression sortExpression = nav.Compile("//@k='job_did_start'");
// selectExpression.AddSort(sortExpression, new DateTimeComparer());
foreach (XPathNavigator item in nav.Select(selectExpression))
{
item.MoveToFirstChild();
do
{
**I’ve omitted the code here because it works and probably is not relevant.**
} while (item.MoveToNext());
}
sortExpression を設定し、その sortExpression を selectExpression に追加する行は機能しないため、コメントアウトしました。
sortExpressionを設定するステートメントで nav.Compile() に渡される文字列の値を把握するだけでよいと思います。
ちなみに、こちらはネットで拝借したDateTimeComparerです。オブジェクト x と y が日付を表す文字列ではないことを確認するために、Compare() メソッド内にブレークポイントを設定しましたが、それは必要なことです。
public class DateTimeComparer : IComparer
{
public int Compare(object x, object y)
{
DateTime dt1 = DateTime.Parse(x.ToString());
DateTime dt2 = DateTime.Parse(y.ToString());
return dt1.CompareTo(dt2);
}
}
「job_did_start」の値は空の文字列になる可能性があるため、おそらく Compare() メソッドでその可能性を考慮する必要があります。
誰かがソートキーを適切に設定するのを手伝ってくれますか?
ありがとうございました。