C# 同步XML模式验证。净额3.5
我知道我可以使用如下回调方法根据模式验证xml,但是有没有一种方法可以同步验证xml而不是事件驱动的 我想到的一种方法是设置一个类成员布尔标志IsValidated=false,然后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.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
即可使用较旧、较慢的版本。