【问题标题】:Deserialize XML to object in C# XmlRoot is not working将 XML 反序列化为 C# XmlRoot 中的对象不起作用
【发布时间】:2017-10-06 00:28:28
【问题描述】:

我正在使用asp.net (C#) 网站,我想Deserialize XML 字符串使用XmlSerializer 类。

我的模型(.cs 文件)

[XmlRoot("MedicalClearanceFormRoot")]
  public class MedicalClearanceViewModel
  {


    [XmlAttribute("PassengerName")]
    public string PassengerName { get; set; }

    [XmlAttribute("Gender")]
    public string Gender { get; set; }

    [XmlAttribute("Age")]
    public string Age { get; set; }

    [XmlAttribute("PhoneNo")]
    public string PhoneNo { get; set; }

    [XmlAttribute("Email")]
    public string Email { get; set; }

    [XmlAttribute("BookingRefNo")]
    public string BookingRefNo { get; set; } 
}

XML 字符串

<MedicalClearanceFormRoot>
  <MedicalClearanceForm PassengerName="AAAAAAAAAAAAA" Age="11" PhoneNo="TTTTTTTTTTT" Email="ZZZZZZZZZZZZZZZZZZZ" BookingRefNo="11111111111111111111" />  
</MedicalClearanceFormRoot>

将 XML 反序列化为对象的代码

string myXMLStringFromDB = GetXMLStringFromDb(); // this method will return XML from db.

    XmlSerializer serializer = new XmlSerializer(typeof(MedicalClearanceViewModel));
              using (TextReader reader = new StringReader(myXMLStringFromDB))
              {
               MedicalClearanceViewModel objModel = (MedicalClearanceViewModel)serializer.Deserialize(reader);
              }

但是,问题是当我使用上面的代码将 XML 反序列化为对象时...PassengerNameAgePhoneNo 等属性在objModel 中仍然是空白的

有人可以帮我在我的班级上设置正确的 XML 表示法吗?有人可以帮我解决这个问题吗?

任何帮助将不胜感激! 谢谢

【问题讨论】:

  • 属性为空,因为&lt;MedicalClearanceFormRoot&gt; 没有在 XML 中声明的任何属性。您的层次结构在 XML 和类代码之间是关闭的。
  • MedicalClearanceViewModel 类不应该有 MedicalClearanceForm 属性,MedicalClearanceForm 应该有当前在 MedicalClearanceViewModel 类中声明的所有属性吗?

标签: c# asp.net xml asp.net-mvc xml-deserialization


【解决方案1】:

按照定义 XML 的方式,您需要定义两个对象: - 一个用于MedicalClearanceFormRoot xml 节点 - 一个用于MedicalClearanceForm xml 节点

因此,您可以采取两条路线:添加包装类或更改您的 xml。

要添加包装类,您需要有一个类来表示MedicalClearanceFormRoot,它具有MedicalClearanceForm 对象的属性。然后将您的序列化程序类更改为包装类。这是一个例子:

[XmlRoot("MedicalClearanceFormRoot")]
public class Wrapper
{
    public MedicalClearanceViewModel MedicalClearanceForm { get; set;}
}

public class MedicalClearanceViewModel
{

    [XmlAttribute("PassengerName")]
    public string PassengerName { get; set; }

    [XmlAttribute("Gender")]
    public string Gender { get; set; }

    [XmlAttribute("Age")]
    public string Age { get; set; }

    [XmlAttribute("PhoneNo")]
    public string PhoneNo { get; set; }

    [XmlAttribute("Email")]
    public string Email { get; set; }

    [XmlAttribute("BookingRefNo")]
    public string BookingRefNo { get; set; }
}


        XmlSerializer serializer = new XmlSerializer(typeof(Wrapper));
        using (TextReader reader = new StringReader(myXMLStringFromDB))
        {
            Wrapper objModel = (Wrapper)serializer.Deserialize(reader);
        }

选项 2:将您的 XML 更改为如下所示:

<MedicalClearanceFormRoot PassengerName="AAAAAAAAAAAAA" Age="11" PhoneNo="TTTTTTTTTTT" Email="ZZZZZZZZZZZZZZZZZZZ" BookingRefNo="11111111111111111111" >  
</MedicalClearanceFormRoot>

【讨论】:

    【解决方案2】:

    我创建了一个示例,代码将与下面完全相同。您的模型不正确。

     public class MedicalClearanceForm
    {
        [XmlAttribute("PassengerName")]
        public string PassengerName { get; set; }
    
        [XmlAttribute("Gender")]
        public string Gender { get; set; }
    
        [XmlAttribute("Age")]
        public string Age { get; set; }
    
        [XmlAttribute("PhoneNo")]
        public string PhoneNo { get; set; }
    
        [XmlAttribute("Email")]
        public string Email { get; set; }
    
        [XmlAttribute("BookingRefNo")]
        public string BookingRefNo { get; set; }
    }
    [XmlRoot("MedicalClearanceFormRoot")]
    public class MedicalClearanceFormRoot
    {
    
    
        [XmlElement("MedicalClearanceForm")]
        public MedicalClearanceForm MedicalClearanceForm { get; set; }
    
    
    }
    class Program
    {
        static void Main(string[] args)
        {
            string myXMLStringFromDB = @"<MedicalClearanceFormRoot><MedicalClearanceForm PassengerName = 'AAAAAAAAAAAAA' Age = '11' PhoneNo = 'TTTTTTTTTTT' Email = 'ZZZZZZZZZZZZZZZZZZZ' BookingRefNo = '11111111111111111111' /></MedicalClearanceFormRoot >";
    
            XmlSerializer serializer = new XmlSerializer(typeof(MedicalClearanceFormRoot));
            using (TextReader reader = new StringReader(myXMLStringFromDB))
            {
                MedicalClearanceFormRoot objModel = (MedicalClearanceFormRoot)serializer.Deserialize(reader);
            }
    
        }
    }
    

    【讨论】:

      【解决方案3】:

      我相信,为了满足指定的 XML,您需要这种类结构。

      [XmlRoot("MedicalClearanceFormRoot")]
      public class MedicalClearanceViewModel
      {
          public MedicalClearanceFormElement MedicalClearanceForm { get; set; }
      }
      
      [XmlElement]
      public class MedicalClearanceFormElement
      {
          [XmlAttribute("PassengerName")]
          public string PassengerName { get; set; }
      
          [XmlAttribute("Gender")]
          public string Gender { get; set; }
      
          [XmlAttribute("Age")]
          public string Age { get; set; }
      
          [XmlAttribute("PhoneNo")]
          public string PhoneNo { get; set; }
      
          [XmlAttribute("Email")]
          public string Email { get; set; }
      
          [XmlAttribute("BookingRefNo")]
          public string BookingRefNo { get; set; } 
      }
      

      【讨论】:

      • 我们不能在课堂上申请[XmlElement]
      • @Prog...为什么不呢?
      • 我们不能在类上应用 [XmlElement]。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      • 2018-07-17
      • 2010-09-18
      • 1970-01-01
      相关资源
      最近更新 更多