17

我需要实现一个 C# 方法,该方法需要针对外部 XSD 验证 XML 并返回一个布尔结果,指示它是否格式正确。

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

1 回答 1

43

根据您是否要对非异常事件使用异常,我可以想到几个选项。

如果传递 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;
}
于 2012-04-11T15:51:33.597 回答