17

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

public static bool IsValidXml(string xmlFilePath, string xsdFilePath);

callback を使用して検証する方法を知っています。コールバックを使用せずに、単一のメソッドで実行できるかどうかを知りたいです。これは純粋に装飾的な目的で必要です。最大数十種類の XML ドキュメントを検証する必要があるため、以下のような単純なものを作成したいと考えています。

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

1 に答える 1

43

例外的ではないイベントに例外を使用するかどうかに応じて、考えられるオプションがいくつかあります。

検証コールバック デリゲートとして 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;
}
于 2012-04-11T15:51:33.597 に答える