2014-09-04 11 views
5

Sto provando a deserializzare il mio file packages.config in C# ma la collezione che ottengo è sempre nullo. C'è qualcosa di speciale che è necessario se il mio file xml è costituito da una singola raccolta di attributi?Perché deserializzare my packages.config in C# restituisce valori null?

[Serializable()] 
[System.Xml.Serialization.XmlTypeAttribute()] 
public class Package 
{ 
    [System.Xml.Serialization.XmlAttribute("id")] 
    public string Id {get;set;} 
    [System.Xml.Serialization.XmlAttribute("version")] 
    public string Version {get;set;} 
} 

[Serializable()] 
[System.Xml.Serialization.XmlRoot("packages")] 
public class PackageCollection 
{ 
    [System.Xml.Serialization.XmlArrayItem("package", typeof(Package))] 
    public Package[] Packages {get;set;}  
} 


void Main() 
{ 
    var path = "C:\D\packages.config"; 
    var serializer = new System.Xml.Serialization.XmlSerializer(typeof(PackageCollection), new System.Xml.Serialization.XmlRootAttribute("packages")); 
    StreamReader reader = new StreamReader(file); 
    var packages2 = (PackageCollection)serializer.Deserialize(reader); 
    reader.Close(); 
} 

dove il mio packages.config assomiglia

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="Autofac" version="3.3.1" targetFramework="net45" /> 
    <package id="Microsoft.AspNet.WebApi.Client" version="4.0.20710.0" targetFramework="net45" /> 
    <package id="Microsoft.AspNet.WebApi.Core" version="4.0.20710.0" targetFramework="net45" /> 
    <package id="Microsoft.AspNet.WebApi.Tracing" version="4.0.30506" targetFramework="net45" /> 
    <package id="Microsoft.Net.Http" version="2.0.20710.0" targetFramework="net45" /> 
    <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" /> 
    <package id="Newtonsoft.Json" version="4.5.11" targetFramework="net45" /> 
</packages> 
+1

è possibile utilizzare xsd.exe per garantire che il codice sia coerente con lo schema: vedere questo esempio http://blogs.msdn.com/b/yojoshi/archive/2011/05/14/xml-serialization-and- deserializzazione-entità-classi-con-XSD-exe.aspx – Isantipov

risposta

2

Usa XmlElement in questo caso:

[Serializable()] 
[System.Xml.Serialization.XmlRoot("packages")] 
public class PackageCollection 
{ 
    [System.Xml.Serialization.XmlElement("package", typeof(Package))] 
    public Package[] Packages { get; set; } 
} 
2

Questo codice sembra funzionare in base alle proprie esigenze in base al test inclusi:

[Serializable()] 
[System.Xml.Serialization.XmlTypeAttribute()] 
public class Package 
{ 
    [System.Xml.Serialization.XmlAttributeAttribute("id")] 
    public string Id { get; set; } 

    [System.Xml.Serialization.XmlAttributeAttribute("version")] 
    public string Version { get; set; } 

    [System.Xml.Serialization.XmlAttributeAttribute("targetFramework")] 
    public string TargetFramework { get; set; } 
} 

[Serializable()] 
[System.Xml.Serialization.XmlRoot("packages")] 
public class PackageCollection 
{ 
    [System.Xml.Serialization.XmlElementAttribute("package")] 
    public Package[] Packages { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
     var path = @"C:\packages.config"; 
     var serializer = new System.Xml.Serialization.XmlSerializer(typeof(PackageCollection)); 
     StreamReader reader = new StreamReader(path); 
     var packages2 = (PackageCollection)serializer.Deserialize(reader); 
     foreach (Package pkg in packages2.Packages) 
     { 
      Console.WriteLine("ID: " + pkg.Id); 
      Console.WriteLine("Version: " + pkg.Version); 
      Console.WriteLine("Target Framework: " + pkg.TargetFramework); 
      Console.WriteLine();    
     }  
     reader.Close(); 
     Console.ReadLine(); 
    } 
} 

Come @Isantipov menzionato, XML Schema Definition Tool (Xsd.exe)- MDSN può essere di aiuto.

Vedere anche la domanda How to Deserialize XML document per ulteriori informazioni, in particolare Marc Gravell's answer.

Problemi correlati