反序列化 XML 到 C# XmlRoot 中的对象不起作用
Deserialize XML to object in C# XmlRoot is not working
我正在使用 asp.net (C#) 网站,我想 Deserialize
XML
字符串使用 XmlSerializer
class。
我的模型(.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 反序列化为对象时...PassengerName
、Age
、PhoneNo
等属性. 在 objModel
中仍然是空白
谁能帮我在 Class 上设置正确的 XML 符号 谁能帮我解决这个问题。
非常感谢任何帮助!
谢谢
要满足指定的 XML,我相信您需要这种 class 结构。
[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; }
}
我已经创建了一个示例,代码将与下面完全一样。您的模型不正确。
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);
}
}
}
您的 XML 的定义方式,您需要定义两个对象:
- 一个用于 MedicalClearanceFormRoot
xml 节点
- 一个用于 MedicalClearanceForm
xml 节点
因此,您有两条路线可以选择:添加包装器 class 或更改您的 xml.
要添加包装器 class,您需要有一个 class 来表示 MedicalClearanceFormRoot
,它有一个 属性 用于 MedicalClearanceForm
对象。然后将序列化器 class 更改为包装器 class。这是一个例子:
[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>
我正在使用 asp.net (C#) 网站,我想 Deserialize
XML
字符串使用 XmlSerializer
class。
我的模型(.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 反序列化为对象时...PassengerName
、Age
、PhoneNo
等属性. 在 objModel
谁能帮我在 Class 上设置正确的 XML 符号 谁能帮我解决这个问题。
非常感谢任何帮助! 谢谢
要满足指定的 XML,我相信您需要这种 class 结构。
[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; }
}
我已经创建了一个示例,代码将与下面完全一样。您的模型不正确。
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);
}
}
}
您的 XML 的定义方式,您需要定义两个对象:
- 一个用于 MedicalClearanceFormRoot
xml 节点
- 一个用于 MedicalClearanceForm
xml 节点
因此,您有两条路线可以选择:添加包装器 class 或更改您的 xml.
要添加包装器 class,您需要有一个 class 来表示 MedicalClearanceFormRoot
,它有一个 属性 用于 MedicalClearanceForm
对象。然后将序列化器 class 更改为包装器 class。这是一个例子:
[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>