2016-02-24 1 views
1

J'ai un fichier XML. Je veux le mapper à un objet. l'un des éléments xml est une chaîne et je veux convertir cette chaîne en valeur int d'une section Enum in set de la propriété. puis renvoyer cette valeur int, mais lorsque le lecteur de fichiers veut désérialiser mon fichier XML à objet, je reçois une erreur d'exécution qui indique "Il y a une erreur dans le document XML (30, 10)".'Une erreur s'est produite dans le document XML (30, 10)' lors du renvoi du type de différence du type d'élément XML

private int processCodeInt; 
    [XmlElement("ProcessCode")] 
    public int ProcessCode 
    { 
     get { return this.processCodeInt; } 
     set 
     { 
      var temp = typeof(Common.Transaction.Definition_Transaction.Def_TrxType_Detail) 
       .GetMembers().Where(i => i.MemberType == MemberTypes.Field).ToList(); 
      this.processCodeInt = Convert.ToInt32(temp.Where(u => u.Name == value.ToString()).FirstOrDefault().ToString()); 
     } 
    } 

Merci à tous.

dans le suivi, je laisse mon code:

cours de cartographie:

[XmlRoot("Model")] 
    public class Model 
    { 
     [XmlElement("Transaction")] 
     public List<Transaction> Transactions; 
    } 
    public class Transaction 
    { 
     [XmlElement("Message")] 
     public List<Message> Messages; 
    } 
    public class Message 
    { 
     [XmlElement("In")] 
     public MessageType In { get; set; } 
     [XmlElement("Out")] 
     public MessageType Out { get; set; } 
    } 
    public class MessageType 
    { 
     [XmlElement("ChannelType")] 
     public int ChannelType { get; set; } 
     [XmlElement("TransactionType")] 
     public int TransactionType { get; set; } 
     private int processCodeInt; 
     [XmlElement("ProcessCode")] 
     public int ProcessCode 
     { 
      get { return this.processCodeInt; } 
      set 
      { 
       var temp = typeof(Common.Transaction.Definition_Transaction.Def_TrxType_Detail) 
        .GetMembers().Where(i => i.MemberType == MemberTypes.Field).ToList(); 
       temp.RemoveAt(0); 
       MemberInfo[] processCodeMemberInfos = temp.ToArray(); 
       this.processCodeInt = Convert.ToInt32(processCodeMemberInfos.Where(u => u.Name == value.ToString()).FirstOrDefault().ToString()); 

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

mon fichier XML:

<?xml version="1.0" encoding="utf-8" ?> 
<Model> 
    <Transaction> 
    <Message> 
     <In> 
     <ChannelType>0</ChannelType> 
     <TransactionType>1</TransactionType> 
     <ProcessCode>Balance</ProcessCode> 
     <IsExpired>0</IsExpired> 
     </In> 
     <Out> 
     <ChannelType>1</ChannelType> 
     <TransactionType>1</TransactionType> 
     <ProcessCode>Balance</ProcessCode> 
     <IsExpired>0</IsExpired> 
     </Out> 
    </Message> 
    </Transaction> 
</Model> 

Code de cartographie:

var TransactionModelsFile = new System.IO.StreamReader(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) 
      [email protected]"/TransactionModels.xml"); 
      System.Xml.Serialization.XmlSerializer reader = 
      new System.Xml.Serialization.XmlSerializer(typeof(Model)); 
      overview = (Model)reader.Deserialize(TransactionModelsFile); 
      TransactionModelsFile.Close(); 
+0

Pourquoi '' ProcessCode' est int' alors que la valeur réelle est 'Balance'? –

+0

@Alex merci pour votre commentaire, s'il vous plaît voir la partie ensemble de la propriété processcode, je veux convertir la valeur de chaîne Enum à Int de ce membre. –

+0

Vous pouvez faire n'importe quoi, mais 'ProcessCode' est int, donc votre code ne sera pas appelé tant que value n'est pas' string'. Donc, utilisez Enums (AFAIK ils sont désérialisés correctement par leur nom), ou chaîne, puis utilisez vos getters et setters pour obtenir un résultat. –

Répondre

1

Comme vous pouvez le voir Je viens d'ajouter Enum au lieu de chaîne car Balance n'est pas une valeur valide pour un champ int. Mais si vous voulez le stocker en entier, j'utilise le backing field dans ce cas.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var ser = new XmlSerializer(typeof(Model)); 
     using (var fs = new FileStream("source.xml", FileMode.Open)) 
     { 
      var obj = (Model) ser.Deserialize(fs); 
      Console.WriteLine(obj.Transactions[0].Messages[0].In.ProcessCode); 
     } 
    } 
} 


public class Model 
{ 
    [XmlElement("Transaction")] 
    public List<Transaction> Transactions; 
} 
public class Transaction 
{ 
    [XmlElement("Message")] 
    public List<Message> Messages; 
} 
public class Message 
{ 
    public MessageType In { get; set; } 
    public MessageType Out { get; set; } 
} 

public class MessageType 
{ 
    public int ChannelType { get; set; } 
    public int TransactionType { get; set; } 
    private int processCodeInt; 

    public ProcessCode ProcessCode 
    { 
     get { return (ProcessCode) processCodeInt; } 
     set { processCodeInt = (int) value; } 
    } 
    public bool IsExpired { get; set; } 
} 

public enum ProcessCode 
{ 
    Balance 
} 

enter image description here

+0

l'avez-vous testé @Alex Zhukovskiy? :) –

+0

@vahidkargar oui, et j'obtiens sortie attendue. –

+0

bon travail @Alex Zhukovski, Merci pour votre effort pour m'aider. accepter la réponse et +1 est le moins de choses que je puisse faire pour la gratitude. –