我的应用程序接收到源源不断的 xml 文件,这些文件或多或少是数据库记录的直接副本
<record type="update">
<field name="id">987654321</field>
<field name="user_id">4321</field>
<field name="updated">2011-11-24 13:43:23</field>
</record>
我需要将其反序列化为一个为所有列提供可为空属性的类
class Record {
public long? Id { get; set; }
public long? UserId { get; set; }
public DateTime? Updated { get; set; }
}
我似乎无法想出一种方法来执行此操作,而无需手动解析 xml 文件并打开字段的 name
属性来存储值。
他们是使用 XmlSerializer 快速实现的方法吗?如果不是,他们是一种更有效的手动解析方式吗?
问候和感谢
我的主要问题是属性 name
需要将其值设置为属性名称并将其值设置为 <field>..</field>
的内容元素
最佳答案
编辑 编辑答案以反射(reflect)当前 xml 布局所能获得的最佳结果,您将获得一个字段对象数组,其中包含两个属性,名称(例如 ID)和值(节点中的文本)
您可以创建一个 Xml 定义类,将其传递给一个 Xml 序列化程序,它会返回您的对象,其中包含初始化到其属性中的 xml 值。
所以给出如下定义文件。
[XmlTypeAttribute]
[XmlRootAttribute("record")]
public class RecordXmlConfiguration
{
[XmlElementAttribute("field")]
public Field[] Fields { get; set; }
}
[XmlTypeAttribute]
public class Field
{
[XmlAttributeAttribute("name")]
public string Name { get; set; }
[XmlText]
public string Value { get; set; }
}
然后当你有你的 xml 时,你将它传递给一个方法,它应该返回你一个 Xml 定义类类型的对象
public static object Deserialize(string xml)
{
var deserializer = new System.Xml.Serialization.XmlSerializer(typeof(RecordXmlConfiguration));
using (var reader = XmlReader.Create(new StringReader(xml)))
{
return (RecordXmlConfiguration)deserializer.Deserialize(reader);
}
}
它可能很繁琐,但是当它设置正确时,它为我节省了大量时间,因为当你完成它时,你还可以在相同的方式中创建一个序列化方法以将它返回到它的 Xml 形式。
确保添加对项目的引用以允许使用这些 using 语句
using System.Xml.Serialization;
using System.Xml;
关于c# - 反序列化使用属性名称/值对的 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8260461/