2009-08-14 10 views

答えて

15

ことは、これを試してみてください:

public void ValidateXmlDocument(
    XmlReader documentToValidate, string schemaPath) 
{ 
    XmlSchema schema; 
    using (var schemaReader = XmlReader.Create(schemaPath)) 
    { 
     schema = XmlSchema.Read(schemaReader, ValidationEventHandler); 
    } 

    var schemas = new XmlSchemaSet(); 
    schemas.Add(schema); 

    var settings = new XmlReaderSettings(); 
    settings.ValidationType = ValidationType.Schema; 
    settings.Schemas = schemas; 
    settings.ValidationFlags = 
     XmlSchemaValidationFlags.ProcessIdentityConstraints | 
     XmlSchemaValidationFlags.ReportValidationWarnings; 
    settings.ValidationEventHandler += ValidationEventHandler; 

    using (var validationReader = XmlReader.Create(documentToValidate, settings)) 
    { 
     while (validationReader.Read()) 
     { 
     } 
    } 
} 

private static void ValidationEventHandler(
    object sender, ValidationEventArgs args) 
{ 
    if (args.Severity == XmlSeverityType.Error) 
    { 
     throw args.Exception; 
    } 

    Debug.WriteLine(args.Message); 
} 
+0

これは一番速いものです。 –

2

希望を使用して、このリンクが役立ちます:

Validation of XML with XSD

+1

リンクがまともに見えますが、私は例が廃止されXmlValidatingReaderをし、使用しているに気づきました。ビヘイビアを定義するいくつかの検証プロパティを含むXmlReaderとXmlReaderSettingsを参照してください。 – STW

5

私はCODE TOOです!私は私のテストでこれを使用します。

public static bool IsValid(XElement element, params string[] schemas) 
    { 
     XmlSchemaSet xsd = new XmlSchemaSet(); 
     XmlReader xr = null; 
     foreach (string s in schemas) 
     { // eh, leak 'em. 
      xr = XmlReader.Create(
       new MemoryStream(Encoding.Default.GetBytes(s))); 
      xsd.Add(null, xr); 
     } 
     XDocument doc = new XDocument(element); 
     var errored = false; 
     doc.Validate(xsd, (o, e) => errored = true); 
     if (errored) 
      return false; 

     // If this doesn't fail, there's an issue with the XSD. 
     XNamespace xn = XNamespace.Get(
         element.GetDefaultNamespace().NamespaceName); 
     XElement fail = new XElement(xn + "omgwtflolj/k"); 
     fail.SetAttributeValue("xmlns", xn.NamespaceName); 
     doc = new XDocument(fail); 
     var fired = false; 
     doc.Validate(xsd, (o, e) => fired = true); 
     return fired; 
    } 

この1つは、文字列(アセンブリ内のファイルリソース)としてのスキーマに取り、スキーマセットに追加します。私は妥当性を検証し、有効でない場合は偽を返します。

xmlが無効であることが判明しない場合、私はスキーマが不正になっていないことを確認するために否定的なチェックを行います。その保証は保証されていませんが、私はこれを使用して私のスキーマでエラーを見つけました。

+1

'XmlSchema.Read'メソッドは、解析中にスキーマを検証できるので、このメソッドを試してみてください。 –

+0

ありがとうコード:) – BigOmar

3

簡単な解決策..

 try 
     { 
      XmlReaderSettings Xsettings = new XmlReaderSettings(); 
      Xsettings.Schemas.Add(null, "personDivideSchema.xsd"); 
      Xsettings.ValidationType = ValidationType.Schema; 

      XmlDocument document = new XmlDocument(); 
      document.Load("person.xml"); 

      XmlReader reader = XmlReader.Create(new StringReader(document.InnerXml), Xsettings); 


      while (reader.Read()); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message.ToString()); 
     } 
関連する問題