验证对XML XSD在一个单一的方法(Validate XML against XSD in a s

2019-06-23 09:54发布

我需要实施一个需要验证对外部XSD的XML,并返回一个布尔结果表明它是否很好地形成或不是C#方法。

public static bool IsValidXml(string xmlFilePath, string xsdFilePath);

我知道如何使用回调验证 。 我想知道,如果它可以在一个单一的方法来完成,而无需使用一个回调。 我需要这个纯粹是为了美容目的:我需要验证多达几十个类型的XML文档,所以我想提出的是如下这样简单的事情。

if(!XmlManager.IsValidXml(
    @"ProjectTypes\ProjectType17.xml",
    @"Schemas\Project.xsd"))
{
     throw new XmlFormatException(
         string.Format(
             "Xml '{0}' is invalid.", 
             xmlFilePath));
}

Answer 1:

有一对夫妇,我可以认为这取决于你是否要使用非特殊事件例外选项。

如果你传递一个null作为验证回调委托,大部分内置的验证方法会抛出一个异常,如果是严重形成XML,所以你可以简单地捕获该异常并返回true / false的情况不同。

public static bool IsValidXml(string xmlFilePath, string xsdFilePath, XNamespace namespaceName)
{
    var xdoc = XDocument.Load(xmlFilePath);
    var schemas = new XmlSchemaSet();
    schemas.Add(namespaceName, xsdFilePath);

    try
    {
        xdoc.Validate(schemas, null);
    }
    catch (XmlSchemaValidationException)
    {
        return false;
    }

    return true;
}

想到的另一种选择推你的极限without using a callback标准。 而是通过一个预先定义的回调方法,你可以改为传递一个匿名方法,并用它来设置一个true / false返回值。

public static bool IsValidXml(string xmlFilePath, string xsdFilePath, XNamespace namespaceName)
{
    var xdoc = XDocument.Load(xmlFilePath);
    var schemas = new XmlSchemaSet();
    schemas.Add(namespaceName, xsdFilePath);

    Boolean result = true;
    xdoc.Validate(schemas, (sender, e) =>
         {
             result = false;
         });

    return result;
}


文章来源: Validate XML against XSD in a single method