【问题标题】:Validate XML against XSD in a single method通过单一方法针对 XSD 验证 XML
【发布时间】:2012-04-19 00:55:36
【问题描述】:

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

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

【问题讨论】:

    标签: c# xml validation xsd schema


    【解决方案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;
    }
    

    【讨论】:

    • 这里的命名空间名称是什么?
    • @hajirazin 你的意思是类型吗,它是XNamespace。它没有在 sn-p 中定义,因为它与示例无关
    • 即使我也有同样的要求。也为我工作。谢谢。
    • 您是否介意提供一个命名空间的示例。目前还不清楚。
    • 你可以为namespaceName添加null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2011-10-12
    • 2011-07-18
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    相关资源
    最近更新 更多