2016-05-27 8 views
0

XMLデータをオブジェクトリストに変換しようとしていますが、エラーが発生します。XMLをC#オブジェクトリストに変換できません

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) 

Iはを追加しようとしましたXMLに
xmlns="http://www.example.com/xsd/ServerDetails"という属性がありましたが、それは助けになりませんでしたが、
のXMLには、と[XMLElement]という属性があります。

+1

あなたは問題を分析することができます。 –

答えて

1

要素名を指定するには、XmlElement Notationを使用します。

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

何も変更されていません。今でも同じエラーです。 – Qwerty

+0

コードが同じであることを確認してください。うまくいきます。デモはhttps://dotnetfiddle.net/7JCmcXをご覧ください。 –

2

クラス名にServerDetailsがあり、xmlにタグ名が異なる場合は、次のように試してみてください。

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

これは同じ例外です。 – Qwerty

2

私はXmlSerializerをたくさん使用するために使用されますが、あなたはXML構造を当てはめるあなたのオブジェクト構造を作成することを余儀なくされているので、私は完全にそれを使用して停止。それは維持するのが難しい。また、XmlSerializerには深刻なメモリリークがあります。あなたが気にしない場合は

は、私はあなたがここにあなたの便宜のためにSystem.Xml.Linq

を参照するテストケースであるしなければならないことに注意してください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"), 
      }; 
     } 
    } 

に切り替えることをお勧めします。まず、第1のオブジェクトをシリアル化し、結果のXMLを表示することにより

[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); 
    } 
関連する問題