web-dev-qa-db-ja.com

単一の方法でXSDに対してXMLを検証する

XMLを外部XSDに対して検証し、整形式であるかどうかを示すブール結果を返す必要があるC#メソッドを実装する必要があります。

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

非例外的なイベントに例外を使用するかどうかに応じて、いくつかのオプションを検討できます。

検証コールバックデリゲートとして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;
}

頭に浮かぶもう1つのオプションは、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;
}
39
psubsee2003