6

次のようなコールバック メソッドを使用してスキーマに対して xml を検証できることはわかっていますが、イベント ドリブンではなく同期的に検証する方法はありますか?

私が考えた 1 つの方法は、クラス メンバーのブール値フラグ IsValidated=false を設定してから、
xml.Validate(ValidationEventHandler) を呼び出すことです。イベント ハンドラーは、終了後に IsValidated=true を設定します。その間、フラグが true に設定されるまでループ チェックを実行してから続行します。

これは .Net 3.5 用です。

    public bool ValidateSchema(string xmlPath, string xsdPath)
    {
        XmlDocument xml = new XmlDocument();
        xml.Load(xmlPath);

        xml.Schemas.Add(null, xsdPath);

        xml.Validate(ValidationEventHandler); 
    }

OK、テストを行ったところ、新しいコードが実行される前にコールバックが完了するまで xml.validate が実際に待機しているようです。

次の例では、MessageBox.Show("After Validate"); myValidationEventHandler の実行後に常に発生します。

また、これを確認するためにコードをステップ実行しました。

だから、私の質問は問題ではないと思います。

// load etc.
...

xmlValidate(myValidationEventHandler);

MessageBox.Show("After Validate");


    private void myValidationEventHandler(object sender, ValidationEventArgs e)
    {
        for (double i = 0; i < 100000; i++)
        {
            textBox1.Text = i.ToString();
            Application.DoEvents();
        }

    // do stuff with e
    }
4

4 に答える 4

6

ValidationEventHandler に null を指定して、Validate メソッドに例外をスローさせることができます。

    public bool ValidateSchema(string xmlPath, string xsdPath)
    {
        XmlDocument xml = new XmlDocument();
        xml.Load(xmlPath);

        xml.Schemas.Add(null, xsdPath);

        try
        {
            xml.Validate(null);
        }
        catch (XmlSchemaValidationException)
        {
            return false;
        }
        return true;
    }
于 2011-10-16T20:33:18.080 に答える
1

を使用しManualResetEventSlimます。

Set()コールバック内のイベント、およびWaitOne()を呼び出した後Validate()

于 2011-10-10T21:41:53.973 に答える
-4

有効な場合に必要なことを行う関数を渡します。これは、検証が正しく終了したら、それにコールバックします。

public void ValidateSchema(string xmlPath, string xsdPath, Action Success)
    {
        XmlDocument xml = new XmlDocument();
        xml.Load(xmlPath);

        xml.Schemas.Add(null, xsdPath);

        if( xml.Validate(ValidationEventHandler) ) Success();
    }
于 2011-10-10T21:45:35.650 に答える