2010-06-15 112 views
1

我有我需要反序列化的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'元素放入data []数组中,而不是我需要的任务类的名称成员。

回答

1

C#不能反序列化泛型列表。所以你需要做的是定义泛型集合数据如何反序列化。为了说明你必须实现GetObjectData(SerializationInfo info,StreamingContext context)。

帮助检出这篇文章。有一个示例代码:

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

+0

你的意思,因为名单的? 这部分在.net 3.5中工作得很好(也许它在早期版本中没有)。生成的XSD代码将其作为task [],但将其更改为List <>会起作用。 问题是,XSD生成的代码将数据元素放入类型为data []的数组中,而我希望它们作为父元素(任务)的属性作为名称标记的字符串。 – LloydPickering 2010-06-15 14:40:17