2017-09-19 5 views
0

j'ai partie du document xmlC# noeud intégré deserializate xml à la propriété de la classe

<Tender SubTenderType="BC" TenderType="Check"> 
    <TenderTotal> 
     <Amount>10.00</Amount> 
    </TenderTotal> 
</Tender> 

i besoin le convertir en classe.

public class Tender 
{ 
    public string SubTenderType { get; set; } 
    public string TenderType { get; set; } 
    public decimal Amount { get; set; } 
} 

ce que j'ai déjà écrit et ce travail. mais je interseing puis-je désérialiser xml à la classe comme écrit ci-dessus?

[Serializable] 
public class Tender 
{ 
    [XmlAttribute("SubTenderType")] 
    public string SubTenderType { get; set; }  

    [XmlAttribute("TenderType")] 
    public string TenderType { get; set; }  

    [XmlElement("TenderTotal")] 
    public TenderTotal TenderTotal { get; set; } 
} 

[Serializable] 
public class TenderTotal 
{ 
    [XmlElement("Amount")] 
    public decimal Amount { get; set; } 
} 
+0

Possible dupliquer de [Comment désérialiser xml à objet] (https://stackoverflow.com/questions/10518372/how-to-deserialize-xml-to-object) – OlegI

+0

Il y a un beaucoup de réponses existantes disponibles https://stackoverflow.com/questions/10518372/how-to-deserialize-xml-to-object https://stackoverflow.com/questions/364253/how-to-deserialize- xml-document – OlegI

+0

@OlegI ce n'est pas en double – mi4man

Répondre

0

Vous pouvez désérialiser XML premier type "tendre" et autoMapper prochaine utilisation de la carte de votre type (créer un nouvel objet de type différent)

créer carte:

config.CreateMap<TenderFirst, TenderSecond>().ForMember(x => x.TenderTotal.Amount, y => y.Amount()) 
0

Vous pouvez faire qui utilise la sérialisation personnalisée xml en implémentant IXmlSerializable. Mais vous aurez une pénalité de performance pour la sérialisation personnalisée.
Vous pouvez jeter un oeil à cet article Custom XML Serialization

0

Avoir la classe suivante sans XmlAttribute:

public class Tender 
{ 
    public string SubTenderType { get; set; } 
    public string TenderType { get; set; } 
    public decimal Amount { get; set; } 
} 

Vous pouvez utiliser la classe XmlAttributeOverrides pour remplacer le comportement du sérialiseur de telle sorte qu'au lieu d'éléments ça ferait les attributs.

var attrSTT = new XmlAttributes { XmlAttribute = new XmlAttributeAttribute("SubTenderType") }; 
var attrTT = new XmlAttributes { XmlAttribute = new XmlAttributeAttribute("TenderType") }; 

var overrides = new XmlAttributeOverrides(); 
overrides.Add(typeof(Tender), nameof(Tender.SubTenderType), attrSTT); 
overrides.Add(typeof(Tender), nameof(Tender.TenderType), attrTT); 

var xs = new XmlSerializer(typeof(Tender), overrides); 

Cependant, de cette manière impossible d'ajouter un nouvel élément ou envelopper un élément dans un autre.


Par conséquent, vous devez faire sérialisation personnalisé ou la carte d'un type à l'autre, ou d'écrire un lecteur xml personnalisé/écrivain, ou d'effectuer la lecture/écriture manuelle (par exemple, en utilisant linq2xml). Il y a plusieurs façons ...