通过单一方法针对 XSD 验证 XML

Posted

技术标签:

【中文标题】通过单一方法针对 XSD 验证 XML【英文标题】:Validate XML against XSD in a single method 【发布时间】: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));

【问题讨论】:

【参考方案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

以上是关于通过单一方法针对 XSD 验证 XML的主要内容,如果未能解决你的问题,请参考以下文章

PHP 5.3.3 无法针对嵌套的 XSD 验证 XML

使用 Java 中的 Xerces 针对 XSD 1.1 进行 XML 验证

针对 XSD 验证 XML [重复]

针对 xsd 执行 xml 验证

针对包含 xsd:import without location 的 XSD 验证 XML

针对同一 XML 模式 (XSD) 加快一批 XML 文件的 XML 模式验证