【问题标题】:Deserialize xml which uses attribute name/value pairs反序列化使用属性名称/值对的 xml
【发布时间】:2012-01-05 19:45:59
【问题描述】:

我的应用程序接收到一个固定的 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 需要将其值设置为属性名称,并将其值设置为&lt;field&gt;..&lt;/field&gt; 元素的内容

【问题讨论】:

    标签: c# xml serialization


    【解决方案1】:

    编辑 编辑了答案以反映您当前 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;
    

    【讨论】:

    • 我过去曾使用过 XML 序列化,它的工作原理非常棒。但是,顺便说一句,我从来没有弄清楚如何捕获 XML 标记属性。
    • @Bodyloss 你可以用默认值来装饰它,如下[XmlAttribute("IsAdmin"), DefaultValue(false)] 只需根据需要更改默认值 =)
    • @Xbones 我已经稍微修改了我的答案AttributeAttribute 装饰器应该获得属性而不是标签中的值
    • @bodyloss 检查编辑后的答案,它在控制台应用程序中对我有用,因为您目前可以为您的 xml 设置获得最佳效果
    • 反序列化为Field 类的列表(在答案中),然后将其转换为问题中的Record 类。只需在Field 类中添加一个[XmlText] public string Content;
    猜你喜欢
    • 1970-01-01
    • 2013-10-09
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多