XMLSerializer无法正确反序列化类型为List的属性的XML。

3
我收到一个XML类型的数据,就像这样;
<Response>
  <Clients>
    <Client>
      <ID>1</ID>
      <Name>John</Name>
      <Age>25</Age>
      <Address>Some address</Address>
    </Client>
    <Client>
      <ID>2</ID>
      <Name>Mark</Name>
      <Age>22</Age>
      <Address>Some address2</Address>
    </Client>
    <Client>
      <ID>3</ID>
      <Name>Phil</Name>
      <Age>30</Age>
      <Address>Some address3</Address>
    </Client>
  </Clients>
</Response>

在 C# 中我有以下代码:

[XmlRoot("Response")]
public class MyClients
{
    [XmlElement("Clients", typeof(MyClient))]
    public List<MyClient> Clients { get; set; }
}

public class MyClient
{
    [XmlElement("ID")]
    public int ID;

    [XmlElement("Name")]
    public string Name;

    [XmlElement("Age")]
    public int Age;

    [XmlElement("Address")]
    public string Address;
}

我正在尝试获取这些数据,使用以下方法:

public ActionResult GetClients()
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("someUrl");
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    XmlSerializer serializer = new XmlSerializer(typeof(WFMClientsList));
    Stream receiveStream = response.GetResponseStream();
    WFMClientsList clients = (MyClients)serializer.Deserialize(receiveStream);
}

但是我没有得到任何回应。

有人能够解释一下如何正确地将XML反序列化为List<MyClient>吗?

3个回答

5

问题在于你声明的内容实际上与你的XML不匹配。如果你从当前声明中序列化一个对象,你会得到:

<?xml version="1.0" encoding="utf-16"?>
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Clients>
    <ID>1</ID>
    <Name>John</Name>
    <Age>25</Age>
    <Address>Some address</Address>
  </Clients>
</Response>

尝试:

[XmlRoot("Response")]
public class MyClients
{
    [XmlArray("Clients")]
    [XmlArrayItem("Client")]
    public List<MyClient> Clients { get; set; }
}

[XmlRoot("Client")]
public class MyClient
{
    [XmlElement("ID")]
    public int ID;
    [XmlElement("Name")]
    public string Name;
    [XmlElement("Age")]
    public int Age;
    [XmlElement("Address")]
    public string Address;
}

这将产生:

<?xml version="1.0" encoding="utf-16"?>
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Clients>
    <Client>
      <ID>1</ID>
      <Name>John</Name>
      <Age>25</Age>
      <Address>Some address</Address>
    </Client>
  </Clients>
</Response>

1

这是错误的:XmlSerializer serializer = new XmlSerializer(typeof(WFMClientsList)); 应该是 XmlSerializer serializer = new XmlSerializer(typeof(MyClients));

你丢失了类 MyClient 的属性。


是的,这是我的不匹配。在撰写这个问题时,我试图使类名更简单。它应该是"MyClients",当然。但仍然无法工作! - JohnyMotorhead

0
  public static T DeserializeObject<T>(string xml)
        {
            XmlSerializer xs = new XmlSerializer(typeof(T));
            MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(xml));
            XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
            return (T)xs.Deserialize(memoryStream);
        }


private static Byte[] StringToUTF8ByteArray(string pXmlString)
        {
            UTF8Encoding encoding = new UTF8Encoding();
            byte[] byteArray = encoding.GetBytes(pXmlString);
            return byteArray;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接