2010-06-15 4 views
1

J'ai des fichiers XML que je dois désérialiser. J'ai utilisé l'outil XSD de Visual Studio pour créer des fichiers objets C#. les classes générées désérialisent les fichiers sauf de la manière dont j'ai besoin.Désérialisation des éléments enfants en tant qu'attributs du parent

J'apprécierais toute aide pour résoudre ce problème.

Les éléments enfants nommés 'data' doivent être des attributs de l'élément parent 'task'.

Un exemple raccourcie du XML est ci-dessous:

<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> 

La définition de classe J'essaie de désérialiser à est sous la forme:

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;} 
} 

L'enfant tâche de sont très bien, mais la Les fichiers générés placent les éléments 'data' dans un tableau de données [] plutôt que comme des membres nommés de la classe de tâches comme j'en ai besoin.

Répondre

1

C# ne peut pas désérialiser les listes génériques. Donc, ce que vous devez faire est de définir comment les données de collecte génériques seront désérialisées. Pour accomplir cela, vous devez implémenter GetObjectData (informations SerializationInfo, contexte StreamingContext).

Pour vous aider à consulter cet article. Il y a un exemple de code:

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

+0

Voulez-vous dire en raison de la Liste ? Cette partie fonctionne parfaitement bien dans .net 3.5 (peut-être pas dans les versions antérieures). Le code XSD généré l'avait comme tâche [] mais le changer pour un fonctionnement List <>. Le problème est que le code généré par XSD place les éléments de données dans un tableau de type data [] alors qu'à la place je veux qu'ils soient des attributs de l'élément parent (task) sous la forme de chaînes nommées par nom. – LloydPickering

Questions connexes