'There is an error in XML document (30, 10)' 从 XML 元素类型返回差异类型时出错

'There is an error in XML document (30, 10)' error while returning difference type from XML element type

我有一个 XML 文件。我想将它映射到一个对象。 xml 元素之一是字符串,我想将此字符串转换为 属性 集合部分中枚举的 int 值。然后 return 这个 int 值,但是当文件 reader 想要将我的 XML 文件反序列化为对象时,我得到运行时错误,显示 "There is an error in XML document (30, 10)".

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

谢谢大家

下面我留下我的代码:

映射类:

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

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

映射代码:

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

如您所见,我只是添加了 Enum 而不是字符串,因为 Balance 不是 int 字段的有效值。但是如果你想把它存储为整数,那么我在这种情况下使用支持字段。

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
}