【问题标题】:Deserializing child elements as attributes of parent将子元素反序列化为父元素的属性
【发布时间】:2010-06-15 20:45:39
【问题描述】:

我有需要反序列化的 XML 文件。我使用 Visual Studio 中的 XSD 工具来创建 c# 对象文件。生成的类会反序列化文件,但不是我需要的方式。

如果您能帮我解决这个问题,我将不胜感激。

名为“data”的子元素应该是父元素“task”的属性。

XML 的简化示例如下:

<task type="Nothing" id="2" taskOnFail="false" >
    <data value="" name="prerequisiteTasks" />
    <data value="" name="exclusionTasks" />
    <data value="" name="allowRepeats" />
    <task type="Wait for Tasks" id="10" taskOnFail="false" >
        <data value="" name="prerequisiteTasks" />
        <data value="" name="exclusionTasks" />
        <data value="" name="allowRepeats" />
    </task>
    <task type="Wait for Tasks" id="10" taskOnFail="false" >
        <data value="" name="prerequisiteTasks" />
        <data value="" name="exclusionTasks" />
        <data value="" name="allowRepeats" />
    </task>
</task>

我试图反序列化的类定义格式为:

public class task {
    public string prerequisiteTasks {get;set;}
    public string exclusionTasks {get;set;}
    public string allowRepeats {get;set;}

    [System.Xml.Serialization.XmlElementAttribute("task")]
    public List<task> ChildTasks {get;set;}
}

子“任务”很好,但生成的文件将“数据”元素放入 data[] 数组中,而不是我需要的任务类的命名成员。

【问题讨论】:

    标签: c# xml-serialization


    【解决方案1】:

    C# 不能反序列化泛型列表。所以你需要做的是定义通用集合数据将如何反序列化。要实现这一点,您必须实现 GetObjectData(SerializationInfo info, StreamingContext context)。

    为了帮助查看这篇文章。有一个示例代码:

    http://www.codeproject.com/KB/cs/CSV2SQLScript.aspx

    【讨论】:

    • 你的意思是因为 List 吗?该部分在 .net 3.5 中运行良好(可能在早期版本中没有)。生成的 XSD 代码将其作为 task[] 但将其更改为 List 有效。问题是 XSD 生成的代码将数据元素放入 data[] 类型的数组中,而我希望它们成为父元素(任务)的属性,作为按名称标记的字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2011-09-29
    相关资源
    最近更新 更多