gpt4 book ai didi

c# - 如何设计一个泛型类来反序列化 XML?

转载 作者:太空宇宙 更新时间:2023-11-03 14:39:37 24 4
gpt4 key购买 nike

我正在尝试编写用于反序列化来自某些 API 的 XML 响应的类。

这是一个示例响应。当我查询 ObjectA 时,

<Response>
<Status>0</Status>
<Message>Ok</Message>
<Data>
<ObjectAs>
<Count>2</Count>
<ObjectA>...</ObjectA>
<ObjectA>...</ObjectA>
</ObjectAs>
</Data>
</Response>

当我查询 ObjectB 时,

<Response>
<Status>0</Status>
<Message>Ok</Message>
<Data>
<ObjectBs>
<Count>1</Count>
<ObjectB>...</ObjectB>
</ObjectBs>
</Data>
</Response>

我正在尝试创建一个通用的 Response 类,但我尝试的一切似乎都是徒劳的。

我无法更改响应结构。而且我试图避免为每种响应类型编写新的 Response 类。

注意在数据下,每个 API 响应是如何不同的。对于 ObjectA,它是 <ObjectAs>对于 ObjectB,它是 <ObjectBs> .

这是我的 ApiResponse 类,

[XmlRoot(ElementName = "Response")]
public class ApiResponse<T>
{
public int Code { get; set; }

public string Message { get; set; }

[XmlAnyElement("Data")]
public XmlElement DataElement { get; set; }

[XmlIgnore]
public List<T> Data
{
get
{
{
return null; // How do I parse and return the list of Objects (A, B, C, whatever?)
}
}
}
}

这是我查询设备时的示例 API XML 响应。

<Response>
<Code>0</Code>
<Message>OK</Message>
<Data>
<Devices>
<Count>2</Count>
<Device>
<Name>0001</Name>
<Active>TRUE</Active>
<DeviceType>1</DeviceType>
<Address>192.168.0.75</Address>
<Port>80</Port>
<Memo/>
</Device>
<Device>
<Name>0002</Name>
<Active>TRUE</Active>
<DeviceType>1</DeviceType>
<Address>192.168.0.78</Address>
<Port>80</Port>
</Device>
</Devices>
</Data>
</Response>

当我查询用户时,

<Response>
<Code>0</Code>
<Message>OK</Message>
<Data>
<Users>
<Count>1</Count>
<User>
<Name>Administrator</Name>
<Group>Admins</Group>
</User>
</Users>
</Data>
</Response>

最佳答案

这是一个使用 LINQ to XML 的通用解决方案有效:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
ApiResponse apiResponse = new ApiResponse(FILENAME);
}
}


public class ApiResponse
{
public int code { get; set; }
public string message { get; set; }
public string _type { get; set; }
public int count { get; set; }

public Dictionary<string, Dictionary<string, string>> dict { get; set; }


public ApiResponse(string filename)
{
XDocument doc = XDocument.Load(filename);
XElement response = doc.Root;
code = (int)response.Element("Code");
message = (string)response.Element("Message");

XElement types = (XElement)response.Element("Data").FirstNode;
_type = types.Name.LocalName;
count = (int)types.Element("Count");
dict = types.Elements().Where(x => x.Name.LocalName != "Count")
.GroupBy(x => (string)x.Element("Name"), y => y.Elements()
.GroupBy(a => a.Name.LocalName, b => (string)b)
.ToDictionary(a => a.Key, b => b.FirstOrDefault()))
.ToDictionary(x => x.Key, y => y.FirstOrDefault());
}
}
}

关于c# - 如何设计一个泛型类来反序列化 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57832698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com