Проверять XML на XSD в одном методе

Мне нужно реализовать метод С#, который должен проверять XML на внешний XSD и возвращать логический результат, указывающий, был ли он сформирован или нет.

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

Ответы

Ответ 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;
}