0

各ノードの時間に基づいて 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() メソッドでその可能性を考慮する必要があります。

誰かがソートキーを適切に設定するのを手伝ってくれますか?

ありがとうございました。

4

1 に答える 1

0

私はそれを考え出した。以下の作品:

XPathExpression sortExpression = nav.Compile("./field[@k='job_did_start']"); 
于 2012-09-05T05:50:02.557 に答える