1

I'm trying to deserialize an external xml into an object. I have no control whatsoever on this xml.

Here's an example:

<response>
 <date>2012-05-23 00:00:00</date>
 <users>
  <userObject0>
   <name>John</name>
   <surname>Smith</surname>
  </userObject0>
  <userObject1>
   <name>Jane</name>
   <surname>Doe</surname>
  </userObject1>
 </users>
</response>

I have no idea why it is done this way, and I cannot figure out how I can deserialize that xml to get an array of userObject.

Is it even possible?

EDIT: Note that the project I'm working is in .net 2.0

4

2 回答 2

1

如果数据不“适合” XmlSerializer,那么:不要使用XmlSerializer. 使用 xml 处理器,例如XmlDocumentor XDocument,例如:

    var response = XElement.Parse(xml);
    var users = (from user in response.Element("users").Elements()
                 select new User {
                     Name = (string) user.Element("name"),
                     Surname = (string) user.Element("surname")
                 }).ToList()
于 2012-05-23T10:59:09.020 回答
0

您可以使用 XmlSerializer 反序列化:

    // Remove numbers from userObject tags
    var xmlStringReplaced = Regex.Replace(xmlString, "<(/?)userObject[0-9]+>", "<$1userObject>");
    // XmlDeserialize the new XML string to a Response object
    var stringReader = new StringReader(xmlStringReplaced);
    var xmlSerialize = new XmlSerializer(typeof(Response), new XmlRootAttribute("response"));
    var response = (Response)xmlSerialize.Deserialize(stringReader);

以及要反序列化为的类型:

public class Response
{
    [XmlIgnore]
    public DateTime Date { get; set; }

    [XmlElement("date")]
    public String DateXmlTemp
    {
        get { return Date.ToString("yyyy-MM-dd HH:mm:ss"); }
        set { Date = DateTime.Parse(value); }
    }

    [XmlArray("users")]
    [XmlArrayItem("userObject")]
    public List<UserObject> Users { get; set; }
}

public class UserObject
{
    [XmlElement("name")]
    public String Name { get; set; }

    [XmlElement("surname")]
    public String Surname { get; set; }
}

如果您想在 userObject 标签中使用数字,您可以更改 Regex.Replace 以将其作为属性添加到标签中,然后使用 XmlAttribute("id") 属性将属性添加到 UserObject 类。

于 2012-06-05T22:42:20.197 回答