我如何反序列化此xml到类

时间:2019-05-30 11:05:42

标签: c#

我想将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>
......

很多messges。很多领域和messge中的组。还有很多group和field中的组!!

原谅我!谢谢!

1 个答案:

答案 0 :(得分:0)

@ppz。无论何时要在StackOverflow社区上寻求帮助或解决方案。我的意思是您期望或遇到一些错误,您必须描述一种正确的方法。以便社区尽快了解并提供更好的解决方案。 你可以参考下面的代码 根据您提供给我们的XML数据。   模型

([a-zA-Z0-9.\-_+]+@[a-zA-Z0-9.-]+\.[a-z]{2,10})
            ^ note backslash here

然后按如下所示反序列化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; }
    }

希望它能对您有所帮助。谢谢..!