同步XML模式验证?.NET 3.5

M3N*_*TA7 6 c# xml xsd xsd-validation

我知道我可以使用如下所示的回调方法对模式验证xml,但有没有一种方法可以同步而不是事件驱动?

我想到的一种方法是设置一个类成员布尔标志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); 
    }
Run Code Online (Sandbox Code Playgroud)

好的,我已经完成了测试,看起来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
    }
Run Code Online (Sandbox Code Playgroud)

Tim*_*z0r 5

您可以为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;
    }
Run Code Online (Sandbox Code Playgroud)


SLa*_*aks 1

用一个ManualResetEventSlim

Set()WaitOne()回调中以及调用后的事件Validate()