【问题标题】:xml deserialize to object c#xml反序列化为对象c#
【发布时间】:2023-03-29 12:30:01
【问题描述】:

我在字符串中有想要反序列化为 C# 对象的 xml 对象。我已经测试了简单的性别类,它工作正常,但不知道为什么我的其他 xml 文档不起作用

xml

<StudentByPersonCode>
  <StudentByPersonCode list="1">
    <Item>
      <PERSON_CODE>33317</PERSON_CODE>
      <FORENAME>Louis</FORENAME>
      <MIDDLE_NAMES>Ane</MIDDLE_NAMES>
      <SURNAME>Sullivan</SURNAME>
      <TITLE>MISS</TITLE>
      <SEX>F</SEX>
      <DATE_OF_BIRTH>1/01/1998 00:00:00</DATE_OF_BIRTH>
      <PROGRESS_STATUS>A</PROGRESS_STATUS>
    </Item>
   </StudentByPersonCode>
 </StudentByPersonCode>

学生班级对象

[Serializable]
[XmlRoot("StudentByPersonCode")]
public class Student
{
    [XmlElement("StudentByPersonCode ")]
    public List<StudentListWrap> StudentListWrap = new List<StudentListWrap>();

    public WebServiceStatus WebServiceStatus { get; set; }
}

public class StudentListWrap
{
    [XmlAttribute("list")]
    public string ListTag { get; set; }

    [XmlElement("Item")]
    public List<Students> Students = new List<Students>();

}


public class Students
{
    [XmlElement("PERSON_CODE")]
    public int PersonCode { get; set; }

    [XmlElement("TITLE")]
    public string Title { get; set; }

    [XmlElement("FORENAME")]
    public string Forename { get; set; }

    [XmlElement("MIDDLE_NAMES")]
    public string MiddleName { get; set; }

    [XmlElement("SURNAME")]
    public string Surname { get; set; }

    [XmlElement("SEX")]
    public string Sex { get; set; }

    [XmlElement("DATE_OF_BIRTH")]
    public DateTime DateOfBirth { get; set; }

    [XmlElement("PROGRESS_STATUS")]
    public string ProgressStatus { get; set; }
} 

要反序列化的类

 public static T DeserializeXMLToObject<T>(string xml) where T : class
    {
        T obj = null;
        StringReader strReader = null;
        XmlSerializer serializer = null;
        XmlTextReader xmlReader = null;
        try
        {
            strReader = new StringReader(xml);
            serializer = new XmlSerializer(typeof(T));
            xmlReader = new XmlTextReader(strReader);
            obj = (T)serializer.Deserialize(xmlReader);
        }
        catch (Exception exp)
        {
            //Handle Exception Code
            var s = "d";
        }
        finally
        {
            if (xmlReader != null)
            {
                xmlReader.Close();
            }
            if (strReader != null)
            {
                strReader.Close();
            }
        }
        return (T)Convert.ChangeType(obj, typeof(T));
    }

}

运行良好的 XML 文档

<Genders>
 <Genders list="1">
  <Item>
   <CODE>M</CODE>
   <DESCRIPTION>Male</DESCRIPTION>
  </Item>
  <Item>
   <CODE>F</CODE>
   <DESCRIPTION>Female</DESCRIPTION>
  </Item>
 </Genders>
</Genders>

性别对象类

 [Serializable]
[XmlRoot("Genders")]
public class Gender
{

    [XmlElement("Genders")]
    public List<GenderListWrap> GenderListWrap = new List<GenderListWrap>();

    public WebServiceStatus WebServiceStatus { get; set; }
}


public class GenderListWrap
{
    [XmlAttribute("list")]
    public string ListTag { get; set; }

    [XmlElement("Item")]
    public List<Item> GenderList = new List<Item>();
}



public class Item
{
    [XmlElement("CODE")]
    public string Code { get; set; }

    [XmlElement("DESCRIPTION")]
    public string Description { get; set; }
}

【问题讨论】:

  • 在我粘贴时错过了
  • Gender 类确实反序列化,但 Student 没有,我不知道为什么?
  • 我认为这只是拼写错误。因此我提出了一个答案

标签: c# xml xml-deserialization


【解决方案1】:

我建议你在这行不小心加了一个空格:

[XmlElement("StudentByPersonCode ")]

试试这个:

[XmlElement("StudentByPersonCode")]

【讨论】:

    【解决方案2】:

    首先,[XmlElement("StudentByPersonCode")] 中的空格,正如@rbr94 所提到的。

    其次,DateTime 字段解析不正确。正确的是,例如: &lt;DATE_OF_BIRTH&gt;2011-01-10&lt;/DATE_OF_BIRTH&gt;。无论如何,您不需要那里的时间来计算出生日期。

    如果必须从 XML 中解析日期,正确的格式是:

    2010-01-01T00:00:00

    【讨论】:

    • 当然,但我无法控制即将到来的 xml 文档,尝试获取字符串,然后立即转换为日期
    猜你喜欢
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2018-10-11
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多