首页 > 解决方案 > 我怎么能反序列化这个 xml 到类

问题描述

我想将一个 XML 文件反序列化为一个类,但它失败了。请帮忙!!

像这样的 XML 文件:

<messages>
   <message name="a">
  <field name="ab"/>
  <field name="ab1"/>
  <field name="ab2"/>
 </message>
   <message name="b">
      <field name="bc"/>
      <group name="ab">
         <field name="ab"/>
         <field name="ab1"/>
         <field name="ab2"/>
          <group name="ab">
             <field name="4"/>
           </group>
      </group>
       <field />
       ....

    </message>
</messages>

这只是一个演示。现实是一个“消息”包括几个“字段”和“组”,组包括几个字段和组!它是随机的而不是恒定的。

我试过这个:

[XmlInclude(typeof(GroupInMsg))]
[XmlType("field")]
public class FieldBase
{
    [XmlAttribute("name")]
    public string name { get; set; }

}

[XmlType("message")]
public class Message
{
    public Message()
    {

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



    public FieldBase[] Fields { get; set; }
}


public class GroupInMsg : FieldBase
{
    public GroupInMsg()
    {

    }

    //[XmlArrayItem(Type = typeof(FieldBase))]
    //[XmlArrayItem(Type = typeof(GroupInMsg))]
    public FieldBase[] Fields { get; set; }
}

我的最终目标是反序列化Quickfix这样的东西

<messages>
    <message name="Heartbeat" msgtype="0" msgcat="admin">
      <field name="TestReqID" required="N"/>
    </message>
    <message name="Logon" msgtype="A" msgcat="admin">
      <field name="EncryptMethod" required="Y"/>
      <field name="HeartBtInt" required="Y"/>
      <field name="RawDataLength" required="N"/>
      <field name="RawData" required="N"/>
      <field name="ResetSeqNumFlag" required="N"/>
      <field name="MaxMessageSize" required="N"/>
      <group name="NoMsgTypes" required="N">
        <field name="RefMsgType" required="N"/>
        <field name="MsgDirection" required="N"/>
      </group>
    </message>
    <message name="TestRequest" msgtype="1" msgcat="admin">
      <field name="TestReqID" required="Y"/>
    </message>
    <message name="ResendRequest" msgtype="2" msgcat="admin">
      <field name="BeginSeqNo" required="Y"/>
      <field name="EndSeqNo" required="Y"/>
    </message>
    <message name="Reject" msgtype="3" msgcat="admin">
      <field name="RefSeqNum" required="Y"/>
      <field name="RefTagID" required="N"/>
      <field name="RefMsgType" required="N"/>
      <field name="SessionRejectReason" required="N"/>
      <field name="Text" required="N"/>
      <field name="EncodedTextLen" required="N"/>
      <field name="EncodedText" required="N"/>
    </message>
    <message name="SequenceReset" msgtype="4" msgcat="admin">
      <field name="GapFillFlag" required="N"/>
      <field name="NewSeqNo" required="Y"/>
    </message>
    <message name="Logout" msgtype="5" msgcat="admin">
      <field name="Text" required="N"/>
      <field name="EncodedTextLen" required="N"/>
      <field name="EncodedText" required="N"/>
    </message>
......

许多消息。许多领域和小组在消息中。还有许多小组和领域!

原谅我!谢谢!

标签: c#

解决方案


@ppz.无论何时你想在 StackOverflow 社区寻求帮助或解决方案。我的意思是你的期望或面临一些错误你必须描述一个正确的方式。这样社区就会理解并尽快提供更好的解决方案。您可以根据您提供给我们的 XML 数据参考以下代码。 模型

[XmlRoot(ElementName = "field")]
    public class Field
    {
        [XmlAttribute(AttributeName = "name")]
        public string Name { get; set; }
    }

    [XmlRoot(ElementName = "message")]
    public class Message
    {
        [XmlElement(ElementName = "field")]
        public List<Field> Field { get; set; }
        [XmlAttribute(AttributeName = "name")]
        public string Name { get; set; }
        [XmlElement(ElementName = "group")]
        public Group Group { get; set; }
    }

    [XmlRoot(ElementName = "group")]
    public class Group
    {
        [XmlElement(ElementName = "field")]
        public List<Field> Field { get; set; }
        [XmlAttribute(AttributeName = "name")]
        public string Name { get; set; }
    }

    [XmlRoot(ElementName = "messages")]
    public class Messages
    {
        [XmlElement(ElementName = "message")]
        public List<Message> Message { get; set; }
    }

你反序列化你的XML,如下所示

string path = string.Empty;
            string xmlInputData = string.Empty;
            try
            {
               path = "XML file path";
                xmlInputData = File.ReadAllText(path);
                Messages _Messages = Deserialize<Messages>(xmlInputData);
            }
            catch (Exception ex)
            {
                throw;
            }

        }
        public static T Deserialize<T>(string input) where T : class
        {
            System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T));

            using (StringReader sr = new StringReader(input))
            {
                return (T)ser.Deserialize(sr);
            }
        }

我希望它可以帮助你。谢谢..!


推荐阅读