2016-05-27 7 views
0

Ich versuche, die XML-Daten in eine Objektliste zu konvertieren, aber es wird ein Fehler ausgegeben.XML kann nicht in C# -Objektliste konvertiert werden

XML

<?xml version="1.0" encoding="utf-8" ?> 
<Servers> 
    <Server> 
    <ServerName>STAGING</ServerName> 
    <ServerIP>XXX.XXX.XX.X</ServerIP>   
    </Server> 
</Servers> 

C#

public class ServerDetails 
{ 
    public string ServerName { get; set; } 
    public string ServerIP { get; set; }   
} 

private void GetXMLData() 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(List<ServerDetails>)); 

    using (FileStream stream = File.OpenRead("D:\\Resource.xml")) 
    { 
    List<ServerDetails> list = (List<ServerDetails>)serializer.Deserialize(stream); 
    //Exception here 
    } 
} 

ERROR

Inner Exception : <Servers xmlns=''> was not expected. 
There is an error in XML document (2,2) 

Ich versuchte, dasHinzufügenund [XMLElement] Attribute der Klasse,
und auch xmlns="http://www.example.com/xsd/ServerDetails" im XML
aber das hat nicht geholfen.

+1

Sie können die Probleme analysieren, indem Sie zuerst ein Objekt serialisieren und das resultierende XML anzeigen. –

Antwort

1

Verwenden Sie XmlElement Notation, um den Elementnamen anzugeben.

public class Servers 
{   
    [XmlElement("Server")] 
    public ServerDetails[] ServersDetails { get; set; } 
} 

public class ServerDetails 
{ 
    public string ServerName { get; set; } 
    public string ServerIP { get; set; } 
} 


private void GetXMLData() 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(Servers)); 

    using (FileStream stream = File.OpenRead("D:\\Resource.xml")) 
    { 
    Servers list = (Servers)serializer.Deserialize(stream); 
    //Exception here 
    } 
} 
+0

Nichts hat sich geändert. Es ist jetzt der gleiche Fehler. – Qwerty

+0

Stellen Sie sicher, dass der Code der gleiche ist, es funktioniert gut für mich, siehe Demo unter: https://dotnetfiddle.net/7JCmcX –

2

Sie haben ServerDetails als Klassenname und in der XML der Tag-Name ist anders, versuchen Sie etwas wie folgt.

public class ServerDetails 
{ 
    public string ServerName { get; set; } 
    public string ServerIP { get; set; }   
} 

public class ServerList 
{ 
    [XmlArray("Servers")] 
    [XmlArrayItem("Server", Type = typeof(ServerDetails))] 
    public ServerDetails[] Servers { get;set;}   
} 

private void GetXMLData() 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(ServerList)); 

    using (FileStream stream = File.OpenRead("D:\\Resource.xml")) 
    { 
     var list = (ServerList)serializer.Deserialize(stream); 
     //Exception here 
    } 
} 
+0

Es ist immer noch dieselbe Ausnahme. – Qwerty

2

habe ich XmlSerializer viel zu verwenden, aber ich benutze es völlig gestoppt, weil Sie gezwungen sind, Ihre Objektstruktur Einpassen der XML-Struktur zu erstellen. Das macht es schwer zu pflegen. Auch XmlSerializer hat einige schwerwiegende Speicherlecks.

Wenn es Ihnen nichts ausmacht, würde ich zu XElement

public IEnumerable<ServerDetails> GetServers(string file) 
    { 
     using (var stream = File.Open(file, FileMode.Open, FileAccess.Read)) 
      return GetServers(stream); 
    } 

    public IEnumerable<ServerDetails> GetServers(Stream stream) 
    { 
     var root = XElement.Load(stream); 
     return GetServers(root); 
    } 

    public IEnumerable<ServerDetails> GetServers(XElement root) 
    { 
     foreach (var server in root.Elements("Server")) 
     { 
      yield return new ServerDetails 
      { 
       ServerName = (string)server.Element("ServerName"), 
       ServerIP = (string)server.Element("ServerIP"), 
      }; 
     } 
    } 

wechseln vorschlagen Bitte beachten Sie, dass Sie System.Xml.Linq

Ihren verweisen hier haben, ist ein Testfall.

[TestMethod] 
    public void CanReadServers() 
    { 
     var xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" + @" 
<Servers> 
    <Server> 
    <ServerName>STAGING</ServerName> 
    <ServerIP>XXX.XXX.XX.X</ServerIP> 
    </Server> 
</Servers>"; 

     IEnumerable<ServerDetails> servers; 
     using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(xml))) 
      servers = GetServers(stream).ToList(); 

     Assert.AreEqual(1, servers.Count()); 
     Assert.AreEqual("STAGING", servers.ElementAt(0).ServerName); 
     Assert.AreEqual("XXX.XXX.XX.X", servers.ElementAt(0).ServerIP); 
    } 
Verwandte Themen