c# - 在单一方法中根据 XSD 验证 XML

标签 c# xml validation xsd schema

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

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

我知道如何 validate using a callback .我想知道它是否可以在不使用回调的情况下通过单一方法完成。我需要这个纯粹是为了装饰目的:我需要验证多达几十种类型的 XML 文档,所以我想做的是像下面这样简单的东西。

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

最佳答案

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

如果您将 null 作为验证回调委托(delegate)传递,如果 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;
}

想到的另一个选项是在不使用回调 条件的情况下突破您的限制。您可以不传递预定义的回调方法,而是传递匿名方法并使用它来设置 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;
}

关于c# - 在单一方法中根据 XSD 验证 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10025986/

相关文章:

C# 窗体 : PropertyGrid not updated when item added to Collection

c# - 了解 Unity.Social 和 Apple GameCenter 排行榜中的 "daily"和 "weekly"范围

java - 如何从 strings.xml 中获取字符串值并将其放入 arraylist [android]

html - 如何防止非提交按钮上的 HTML5 表单验证?

jQuery 验证插件 : both required and minlength depending on another field

c# - 如何在简单注入(inject)器中注册实例集合

c# - 如何检测 WebBrowser 控件中的复选框何时被选中?

ios - 无法访问 4 天天气 - MSN 天气

xml - 如何在不在 E4X 中循环的情况下将属性添加到 XMLLIST

java - 在多个类的 spring MVC Controller 中应用自定义 validator