c# - 我怎么能反序列化这个 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>
......
许多消息。许多领域和小组在消息中。还有许多小组和领域!
原谅我!谢谢!
解决方案
@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);
}
}
我希望它可以帮助你。谢谢..!
推荐阅读
- python-3.x - Haskell中的左右字符串对齐
- javascript - 在后台运行 React 开发服务器的方法
- math - 等腰三角形的可微有符号距离函数(视场)
- http - 预览请求的标准 HTTP 请求标头
- c# - 游戏对象在碰撞时不执行任何操作
- google-apps-script - 使用 google 脚本将文件夹附加到现有日历条目
- reactjs - TypeError:无法在字符串“<”上创建属性“transaction_date”
- node.js - NodeJS 从 net.Socket 获取 SO_ORIGINAL_DST
- sockets - 这两个套接字如何正确读取(无代码)?
- javascript - JS 将值推送到带有字符串键和数组值的对象中