2016-06-27 5 views
0

XMLファイルをスキーマに検証してxmlをクラスにデシリアライズできない理由がわかりません。私は困惑しています。私はXMLの検証とデシリアライズができません。

いずれかまたはを指定できます。つまり、ValidateXMLをコメントアウトすると、ConvertToObjectが機能し、逆も同様です。 "このエラーが発生した場合、通常、ドキュメントをデシリアライズする前にドキュメントを開いたままにしておきます。

私の主なロジック

foreach (var myFile in Directory.EnumerateFiles(@"C:MyFolder", "*.xml")) 
      { 
       try 
       { 
        using (var fileStream = new FileStream(myFile, FileMode.Open, FileAccess.Read)) 
        { 
         if (ValidateXML(fileStream)) 
         { 
          CreateObjects(fileStream); 
          goodCounter++; 
         } 
         else 
         { 
          sb.AppendLine("Validation failed for: " + myFile); 
          badCounter++; 
         } 
        } 
       } 
       catch 
       { 
        sb.AppendLine(myFile); 
       } 
      } 

マイvalidateメソッド:

private bool ValidateXML(Stream stream) 
{ 
    try 
    { 
     XmlDocument xDoc = new XmlDocument(); 
     xDoc.Load(stream); 
     xDoc.Schemas.Add(null, @"C:My_XSD.xsd"); 

     ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler); 
     xDoc.Validate(eventHandler); 

     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 
    static void ValidationEventHandler(object sender, ValidationEventArgs e) 
    { 
     switch (e.Severity) 
     { 
      case XmlSeverityType.Error: 
       //Console.WriteLine("Error: {0}", e.Message); 
       throw new Exception(e.Message); 
       //break; 
      case XmlSeverityType.Warning: 
       //Console.WriteLine("Warning {0}", e.Message); 
       throw new Exception(e.Message); 
       //break; 
     } 

    } 
+2

あなたは番目の位置を設定する必要があるかもしれませんe filestreamを元に戻してからオブジェクトを作成しようとします。 – Kevin

+0

'XmlNodeReader'を使って' XmlDocument'から直接デシリアライズすることができます。 [StringReader vs XmlNodeReaderでオブジェクトプロパティをDeserializeする](https://stackoverflow.com/questions/30102275/deserialize-object-property-with-stringreader-vs-xmlnodereader)または[XmlElement [] 'を初期化する方法https://stackoverflow.com/questions/32805732/how-to-initialize-xmlelement)。 – dbc

答えて

0

ケビンは正しかった...

fileStream.Seek(0, SeekOrigin.Begin); 
関連する問題