C# 同步XML模式验证。净额3.5

C# 同步XML模式验证。净额3.5,c#,xml,xsd,xsd-validation,C#,Xml,Xsd,Xsd Validation,我知道我可以使用如下回调方法根据模式验证xml,但是有没有一种方法可以同步验证xml而不是事件驱动的 我想到的一种方法是设置一个类成员布尔标志IsValidated=false,然后 调用xml.Validate(ValidationEventHandler)。一旦完成,事件处理程序将设置IsValidated=true。同时,执行循环检查,直到标志设置为true,然后继续 这是针对.NET3.5的 public bool ValidateSchema(string xmlPath, s

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

我想到的一种方法是设置一个类成员布尔标志IsValidated=false,然后
调用xml.Validate(ValidationEventHandler)。一旦完成,事件处理程序将设置IsValidated=true。同时,执行循环检查,直到标志设置为true,然后继续

这是针对.NET3.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
    }
//加载等。
...
xmlValidate(myValidationEventHandler);
MessageBox.Show(“验证后”);
私有void myValidationEventHandler(对象发送方,ValidationEventTargs e)
{
对于(双i=0;i<100000;i++)
{
textBox1.Text=i.ToString();
Application.DoEvents();
}
//用e做东西
}
使用一个


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

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

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

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

我认为M3NTA7是对的,当我们担心它是异步的时,我们把它看错了。
别忘了,您首先不是以异步方式调用Validate(),因此您不会离开线程

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


所以,当Validate()返回时,所有这些都将完成。

我认为您输入了一个错误,您的意思是“异步执行”而不是“同步执行”,对吗?我不明白您的意思。这是同步的。当发现错误或警告时,将同步调用
ValidationEventHandler
。你想要什么呢?所谓同步,我的意思是,在我知道是否发现错误之前,我不想继续,因为我想根据是否存在错误来建立后续逻辑。对于事件处理程序,我不知道事件何时触发,因此我需要等到它触发后再继续。请投票确认XmlDocument.Validate是一个同步调用。我认为他在这里有点误导。这就是我一直在寻找的方向。理想情况下,这甚至是没有事件的事情。基本上,我只想在验证完成之前一直呆着。另一个注意事项是,我正在使用.NET3.5。很抱歉,我没有提到这一点。我将更新我的问题。只需删除
Slim
即可使用较旧、较慢的版本。