2010-09-03 8 views
2

J'ai du code XML que je voudrais sérialiser dans une classe.C# XML Sérialisation de l'attribut

<MasterData> 
    <Data> 
    <SomeInnerData> 
     some inner data 
    </SomeInnerData> 
    </Data> 
</MasterData> 
<MoreData> 
    <SubMoreData>moredate</SubMoreData> 
</MoreDate> 

et

[System.SerializableAttribute()] 
public class MasterData 
{  
    public string SomeInnnerData {get;set;} 
    public string SubMoreDate {get;set;} 
} 

Comment puis-je définir les variables membres de chaîne pour sérialiser les données appropriées dans le XML? Mon problème se pose en ce que l'élément n'est pas un enfant de l'élément MasterData.

+0

Si vous ne voulez pas créer toutes les classes nécessaires à la prise en charge de la sérialisation par défaut, il est préférable d'implémenter 'IXmlSerializable'. Ensuite, vous pouvez avoir votre classe et sa représentation en XML aussi différente que vous le souhaitez.De toute façon, vous avez ** BESOIN ** pour créer un fichier xml valide, que vous n'avez actuellement pas – CaffGeek

Répondre

0

L'exemple XML que vous avez fourni n'est pas un code XML valide. Vous ne pourrez donc pas le sérialiser directement. Vous avez besoin d'un nœud racine pour que cela fonctionne de cette façon.

tel que:

<AllData> 
    <MasterData> 
     <Data> 
      <SomeInnerData> 
        some inner data 
      </SomeInnerData> 
     </Data> 
    </MasterData> 
     <MoreData> 
      <SubMoreData>moredate</SubMoreData> 
    </MoreDate> 
<AllData> 

[System.SerializableAttribute()] 
public class AllData 
{ 
public MasterData MasterData {get;set;} 
public MoreData MoreData {get;set;} 
} 

[System.SerializableAttribute()] 
public class Data 
{ 
    public string SomeInnnerData {get;set;} 
} 

[System.SerializableAttribute()] 
public class MasterData 
{ 
    public string SomeInnnerData {get;set;} 
} 

[System.SerializableAttribute()] 
public class MasterData 
{ 
    public Data Data {get;set;} 
} 

[System.SerializableAttribute()] 
public class MoreData 
{ 
    public string SubMoreDate {get;set;} 
} 
+0

Est-il possible d'avoir le MoreDate dans la MasterData et d'une manière ou d'une autre dire à la classe MasterData que le noeud est situé @ // RealMasterData/SubMoreData / – thenth

0

Avec la classe .NET XMLSerializer normale, les propriétés publiques sont sérialisées par défaut. Vous devez attribuer explicitement les propriétés pas être sérialisé:

[System.Xml.Serialization.XmlIgnoreAttribute] 

est ici la documentation: XmlSerializer

...

Maintenant que vous avez votre RÉVISÉ question, la réponse est que vous ne pourra plus utiliser la classe XMLSerializer. (Ou vous devrez avoir une classe intermédiaire qui correspond à la structure de votre XML, pour faciliter la sérialisation et la désérialisation.) Si vous avez une structure XML très spécifique que vous voulez transformer arbitrairement, utilisez un XmlReader.

2

La façon la plus simple est de travailler en arrière, obtenir la configuration de votre classe à sérialiser dans le format que vous voulez, de sorte que vous pouvez désérialiser en avec facilité.

Note: Votre xml n'a pas validé, donc je l'ai changé à cela pour un exemple

<MasterData> 
    <Data> 
     <SomeInnerData>some inner data</SomeInnerData> 
    </Data> 
    <MoreData> 
     <SubMoreData>moredate</SubMoreData> 
    </MoreDate> 
</MasterData> 

Actuellement, votre problème est que vous avez Data et MoreData éléments qui ne correspondent pas à quoi que ce soit

Vous auriez besoin de créer des classes comme

public class MasterData { 
    public Data Data {get; set;} 
    public MoreData Data {get; set;} 
} 

public class Data { 
    public string SomeInnerData {get; set;} 
} 

public class MoreData { 
    public string SubMoreData {get; set;} 
} 

Vous pouvez avoir vos propriétés nommées autres, et utilisez le [XmlElement(ElementName="SubMoreData")] pour mapper la propriété, à l'élément correct.

Ou, vous pouvez implémenter l'interface IXmlSerializable et écrire sur commande code sérialisation en une seule classe à mapper votre classe xml mais vous voulez

0

Mettre en oeuvre IXmlSerializable pour la sérialisation personnalisée

0

Comment l'utilisation de XSL pour transformer de/vers le format XML que votre classe C# directement sérialise?