2011-07-22 23 views
0

EDIT2:問題は私のxsdのようです。それはほとんどすべてのXMLを検証します。私はここにXSDを投稿することはできません。なぜすべてのXMLがXSDのために有効でしょうか?LINQを使用してXSDでXMLを検証する方法

EDIT:hereの回答で同様のサンプルが見つかりました。同じ問題ですが、xmlとxsdを比較してもエラーはありません。たとえ私がランダムな別のxsdを使用しても、それはすべてが上手であると言っています。

私はLINQなしでそれをやっている例がたくさんありましたが、LINQではどうしますか?

私は例を見つけるためにGoogleを使用しましたが、ほとんどの場合、すべてのXMLを検証して検証をスキップしているようです。 (それは一度それに入ってファイルを拒否しましたが、私はそれを再現できませんでした)

バリデーションをスキップする方法はありますか?どうやらvalidateメソッドは、その文書の名前空間を有効にいずれかのスキーマのコレクションを検索しますので、あなたは、あなたがチェックしているXMLの名前空間に一致するのtargetNamespaceスキーマを持っている必要があり、XMLためにLINQを使用して

public String ValidateXml2(String xml, String xsd) 
    { 
     String Message = String.Empty; 

     var ms = new MemoryStream(Encoding.Default.GetBytes(xml)); 

     // Create the XML document to validate against. 
     XDocument xDoc = XDocument.Load(ms, LoadOptions.PreserveWhitespace); 
     XmlSchemaSet schema = new XmlSchemaSet(); 

     bool isError = new bool(); // Defaults to false. 
     int countError = 1;   // Counts the number of errors have generated. 
     Stream xsdMemoryStream = new MemoryStream(Encoding.Default.GetBytes(xsd)); 

     // Add the schema file you want to validate against. 
     schema.Add(XmlSchema.Read 
       (xsdMemoryStream, 
        new ValidationEventHandler((sender, args) => 
        { 
         Message = args.Exception.Message; 
        }) 
       )); 

     // Call validate and use a LAMBDA Expression as extended method! 
     // Don't you love .NET 3.5 and LINQ... 
     xDoc.Validate(schema, (sender, e) => 
     { 
      switch (e.Severity) 
      { 
       case XmlSeverityType.Error: 
        Console.WriteLine("Error {0} generated.", countError); 
        break; 
       case XmlSeverityType.Warning: 
        Console.WriteLine("Warning {0} generated.", countError); 
        break; 
      } 
      Console.WriteLine(sender.GetType().Name); 
      Console.WriteLine("\r\n{0}\r\nType {1}\r\n", e.Message, 
                 e.Severity.ToString()); 

      Console.WriteLine("-".PadRight(110, '-')); 
      countError++; 
      isError = true; // If error fires, flag it to handle once call is complete. 
     } 
      , true); // True tells the validate call to populate the post-schema-validation 
     // which you will need later, if you want to dive a littel deeper... 

     if (isError == true) // Error has been flagged. Lets see the errors generated. 
      Console.WriteLine("You my friend have {0} error(s), now what?", countError); 
     else 
      Console.WriteLine("You rock! No errors..."); 

     Console.Write("\r\n\r\nPress Enter to End"); 
     Console.ReadKey(); 


     return Message; 
    } 

Credits and original example

答えて

関連する問題