在单个方法中针对XSD验证XML

Ger*_*orm 16 c# xml validation schema xsd

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

public static bool IsValidXml(string xmlFilePath, string xsdFilePath);
Run Code Online (Sandbox Code Playgroud)

我知道如何使用回调进行验证.我想知道是否可以在单个方法中完成,而不使用回调.我需要这个纯粹用于美容目的:我需要验证多达几十种类型的XML文档,所以我想做的就像下面这样简单.

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

psu*_*003 39

我可以考虑几种选择,具体取决于您是否要对非异常事件使用异常.

如果传递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;
}
Run Code Online (Sandbox Code Playgroud)

想到的另一个选择会推动您的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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是什么命名空间名称? (2认同)