使用 RestSharp 反序列化 XML 序列 [英] Xml Sequence deserialization with RestSharp
问题描述
我从一个带有 XML 序列的 API 获得了这个 xml 提要.
I have this xml feed from an API with a XML sequence.
<?xml version="1.0" encoding="UTF-8" ?>
<Function>
<Cmd>2002</Cmd>
<Status>1</Status>
<Cmd>2003</Cmd>
<Status>0</Status>
<Cmd>2004</Cmd>
<Status>0</Status>
<Cmd>1012</Cmd>
<Status>3</Status>
<Cmd>2006</Cmd>
<Status>0</Status>
<Cmd>2007</Cmd>
<Status>0</Status>
...
</Function>
我已经尝试了一些使用 Restsharp 进行反序列化的选项.理想情况下,我想要类似以下的内容,但显然行不通.
I already tried a few options for deserialization with Restsharp. Ideally I would like to have something like the following, but it's obviously not working.
public class MyResponse
{
public List<Setting> Settings { get; set;}
}
public class Setting
{
public int Cmd { get; set; }
public int Status { get; set; }
}
谢谢
推荐答案
您可以使用 DotNetXmlDeserializer
使微软的 XmlSerializer
执行实际的反序列化.如下定义您的 MyResponse
类,使用 XML 序列化属性 用于指定元素名称以及对 Cmd/Status
元素交替序列的特殊处理:
You can use the DotNetXmlDeserializer
of RestSharp to make Microsoft's XmlSerializer
do the actual deserialization. Define your MyResponse
class as follows, using XML serialization attributes to specify element names and also special handling for the Cmd/Status
alternating sequence of elements:
[XmlRoot("Function")]
public class MyResponse
{
[XmlIgnore]
public List<Setting> Settings { get; set; }
/// <summary>
/// Proxy property to convert Settings to an alternating sequence of Cmd / Status elements.
/// </summary>
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
[XmlAnyElement]
public XElement[] Elements
{
get
{
if (Settings == null)
return null;
return Settings.SelectMany(s => new[] { new XElement("Cmd", s.Cmd), new XElement("Status", s.Status) }).ToArray();
}
set
{
if (value == null)
Settings = null;
else
Settings = value.Where(e => e.Name == "Cmd").Zip(value.Where(e => e.Name == "Status"), (cmd, status) => new Setting { Cmd = (int)cmd, Status = (int)status }).ToList();
}
}
}
然后反序列化如下:
var serializer = new DotNetXmlDeserializer();
var myResponse = serializer.Deserialize<MyResponse>(response);
原型 fiddle.
这篇关于使用 RestSharp 反序列化 XML 序列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!