2012-04-05 11 views
15

外部XSDに対してXMLを検証し、整形式であるかどうかを示すブール値を返す必要があるC#メソッドを実装する必要があります。1つのメソッドで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)); 
} 

答えて

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

他のオプションは、あなたの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; 
} 
+2

ここに名前空間名詞とは何ですか? – hajirazin

+1

@hajirazinあなたは型を意味しますか?それは 'XNamespace'です。それはスニペットで定義されていません。同じ要件があったとしても、それは例 – psubsee2003

+0

に従わなかったからです。私のために働いています。ありがとう。 – hajirazin

関連する問題