2016-04-28 8 views
0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 
using System.Xml; 
using System.Xml.Serialization; 
using System.Xml.Schema; 
using System.IO; 
using System.Xml.XmlConfiguration; 
using OATAssetTracking.Solution.Presenter; 

namespace WindowsFormsApplication2 
{ 
public class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 

    static void Main() 
    { 

     string path = "SearchDefinition.xml"; 
     XmlSchemaSet schemas = new XmlSchemaSet(); 
     schemas.Add(null, @"D:\searchDefinition.xsd"); 

     Exception firstException = null; 

     var settings = new XmlReaderSettings 
     { 
      Schemas = schemas, 
      ValidationType = ValidationType.Schema, 
      ValidationFlags = 
       XmlSchemaValidationFlags.ProcessIdentityConstraints | 
       XmlSchemaValidationFlags.ReportValidationWarnings 
     }; 
     settings.ValidationEventHandler += 
      delegate(object sender, ValidationEventArgs args) 
      { 
       if (args.Severity == XmlSeverityType.Warning) 
       { 
        Console.WriteLine(args.Message); 
       } 
       else 
       { 
        if (firstException == null) 
        { 
         firstException = args.Exception; 
        } 

        Console.WriteLine(args.Exception.ToString()); 
       } 
      }; 

     Search result=null; 

     using (var input = new StreamReader(path)) 
     { 
      using (XmlReader reader = XmlReader.Create(input, settings)) 
      { 
       XmlSerializer ser = new XmlSerializer(typeof(Search)); 
       result = (Search)ser.Deserialize(reader); 
      } 
     } 

     if (firstException != null) 
     { 
      throw firstException; 
     } 

     MessageBox.Show("Deserialization Done!!!!"); 


     } 
} 

}Deserialize XML in C# Windows-Geräte-Projekt zum Objekt

In diesem,

Hier suchen ist Klassenname, der von XSD generiert

result = (Search) ser. Deserialisieren (Leser);

Diese obige Anweisung funktioniert gut in Windows Forms Application, aber funktioniert nicht mit Windows Device Project "Keine Fehler, aber hängt nur dort nicht ausgeführt werden".

+0

Erhm ... nur neugierig, was ist ein "Windows Device" -Projekt? Ich habe VS2015 pro und kann diesen Projekttyp nicht finden ... vielleicht meinst du UWP? – Gusman

+0

Das Projekt ist Smart Device Project, das unter .NET Framework 3.5 in VS2008 kommt –

Antwort

0

Eigentlich Das Problem in dem obigen Code war

result = (Search) ser.Deserialize (Leser);

Der XML-Reader, der erstellt wurde, kann nicht verwendet werden, während er direkt zu einem Objekt deserialisiert wird. Diese Art von oben genanntem Code wird nur in der "Windows Forms Application" in VS2008 unterstützt und wird in keiner Art von "Smart Device Projects" unterstützt.

So, Reader-Einstellungen können enthalten sein und XML-Fehler können von jedem Handler wie ValidationEventHandler behandelt werden.

Also, unten Code validiert das XML gegen XSD und Deserialisierung des Objekts initialisiert.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 
using System.Xml; 
using System.Xml.Serialization; 
using System.Xml.Schema; 
using System.IO; 
using OATAssetTracking.Solution.Presenter; 

namespace WindowsFormsApplication2 
{ 
public class Program 
{ 

    static void Main() 
    { 
     string path2 = System.IO.Path.GetDirectoryName(
      System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\" + "SearchDefinition.xsd"; 
     string path1 = System.IO.Path.GetDirectoryName(
      System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\" + "SearchDefinition.xml"; 

     XmlSchema schema; 
     using (var schemaReader = XmlReader.Create(path2)) 
     { 
      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(path1, settings)) 
     { 
      while (validationReader.Read()) 
      { 
      } 
     } 
     MessageBox.Show("XML verified Successfully...."); 

     XmlSerializer ser = new XmlSerializer(typeof(Search)); 

     Search result = ser.Deserialize(new FileStream(path1, FileMode.Open)) as Search; 

     MessageBox.Show("Deserilization Done Successfully!!!!"); 


    } 

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

    } 
} 
}