【问题标题】:Xml Deserialization - XmlElement wildcard in ElementNameXml 反序列化 - ElementName 中的 XmlElement 通配符
【发布时间】:2023-04-01 13:01:01
【问题描述】:

我正在尝试将外部 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

【问题讨论】:

    标签: .net xml wildcard xml-deserialization


    【解决方案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()
    

    【讨论】:

    • 谢谢 Marc,我不能使用这种方法,因为我正在使用 .net 2。抱歉没有说清楚。无论如何都要 +1
    【解决方案2】:

    可以使用 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 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 2011-09-17
      相关资源
      最近更新 更多