反序列化使用属性名称/值对的xml

时间:2011-11-24 17:03:33

标签: c# xml serialization

我的应用程序收到一个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>元素的内容

1 个答案:

答案 0 :(得分:7)

修改 编辑答案以反映您使用当前xml布局可以获得的最佳效果,您将获得具有两个属性的字段对象数组,名称,例如ID和值,节点中的文本

您可以创建一个Xml Definition类,将其传递给Xml Serializer,它会返回对象,并将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);
        }
    }

它可能很繁琐,但是当它设置正确时,它节省了我很多时间,就像你完成它一样,你也可以在同一个maanner中创建一个序列化方法,将它返回到它的Xml形式。

确保添加对项目的引用以允许这些使用语句

using System.Xml.Serialization;
using System.Xml;