同步 XML 架构验证? .NET 3.5

发布于 2024-12-09 06:27:32 字数 1070 浏览 0 评论 0原文

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

我想到的一种方法是设置一个类成员布尔标志 IsValidated=false then
调用 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); 
    }

好的,我已经做了一个测试,看来 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
    }

I know I can validate xml against a schema using a callback method like the following, but is there a way that I can do it synchronously instead of event driven?

One way I thought of would be to set a class member boolean flag IsValidated=false then
call xml.Validate(ValidationEventHandler). The event handler would set IsValidated=true once it's finished. In the mean time, do a loop checking until the flag is set to true then continue.

This is for .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, I have done a test and it appears that xml.validate actually waits until the callback has completed before new code is executed.

In the following example, the MessageBox.Show("After Validate"); always happens after the execution of myValidationEventHandler.

I also stepped through the code to verify this.

So I guess that makes my question a non issue.

// 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
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

冰雪梦之恋 2024-12-16 06:27:32

您可以为 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;
    }

You can specify null for the ValidationEventHandler to have the Validate method throw an exception.

    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;
    }
栩栩如生 2024-12-16 06:27:32

使用 ManualResetEventSlim

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

Use a ManualResetEventSlim.

Set() the event in the callback, and WaitOne() after calling Validate().

眸中客 2024-12-16 06:27:32

我认为 M3NTA7 是对的,当我们担心它是异步的时,我们会看到这个错误。
不要忘记,您一开始就没有以异步方式调用 Validate(),因此您不会离开线程。

我们将“validationCallback”地址作为目标传递,以便我们可以自定义对验证中的任何错误的处理。
但是我相信调用验证回调委托的过程都是在同步调用 Validate() 中同步发生的。 :)

所以当 Validate() 返回时一切都会完成。

I think M3NTA7 is right that we're looking at this wrong when we worry about it being asynchronous.
Don't forget, you are not invoking Validate() in an asynchronous manner in the first place, so you aren't leaving the thread.

We pass the "validationCallback" address as a target so that we can customize the handling of any errors from validation.
But that process of calling the validation callback delegate all happens I believe synchronously inside the synchronous call to Validate(). :)

So it will all be done when Validate() returns.

↘人皮目录ツ 2024-12-16 06:27:32

我会传入一个函数,如果有效,它会执行您需要它执行的操作,一旦正确完成验证,就会回调该函数。

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();
    }

I would pass in a function that does what you need it to do if Valid, this would then call back to that once its finished validation correctly.

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();
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文