Xml反序列化 - ElementName中的XmlElement通配符

时间:2012-05-23 10:43:59

标签: .net xml wildcard xml-deserialization

我正在尝试将外部xml反序列化为对象。我无法控制这个xml。

以下是一个例子:

<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>

我不知道为什么会这样做,我无法弄清楚如何反序列化该xml以获取userObject数组。

甚至可能吗?

编辑:请注意,我正在使用的项目是.net 2.0

2 个答案:

答案 0 :(得分:1)

如果数据“不适合”XmlSerializer,则:不要使用XmlSerializer。使用xml处理器,例如XmlDocumentXDocument,例如:

    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()

答案 1 :(得分: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类。