gpt4 book ai didi

c# - 具有相同名称的多个元素,具有多个子元素

转载 作者:数据小太阳 更新时间:2023-10-29 02:31:09 25 4
gpt4 key购买 nike

我遇到了一个问题,我需要基本反序列化这个:

<?xml version="1.0" encoding="UTF-8"?>
<api_data>
<status>ok</status>
<sessions>
<id>2</id>
<sessionID>6bfd1f1a7e87a8a6ed476234ad1d6e86</sessionID>
<gameID>1</gameID>
<maxPlayers>8</maxPlayers>
<hostIP>12.0.0.1</hostIP>
<hostPort>1993</hostPort>
<inProgress>0</inProgress>
<timestamp>1358894690</timestamp>
</sessions>
<sessions>
<id>3</id>
<sessionID>eeb4dc2df32f885c2b7d13f28a246830</sessionID>
<gameID>1</gameID>
<maxPlayers>8</maxPlayers>
<hostIP>12.0.0.1</hostIP>
<hostPort>1993</hostPort>
<inProgress>0</inProgress>
<timestamp>1358894732</timestamp>
</sessions>
</api_data>

我需要将其转换为可用数据,它也是动态的,因此可能不止 2 个 session 元素,可能有 4、20 或 0,我现在的代码刚刚损坏,我是想知道什么是让它起作用的好方法?

目前我已经完成了 XDocument 类的工作,所有这些都已加载。我需要用这些数据返回一个多维数组。

编辑:

当前代码,完全损坏:

var xmlSessions = xmlDATA.Descendants("api_data").Elements("sessions").Select(x => x);

result = new string[xmlDATA.Descendants("api_data").Count(), 7];

编辑 2:更多信息

我认为多维数组的方式如下:

array[0,0] "ok" //Status
array[1,0 to 7] //First Session details go here
array[2,0 to 7] //Second session details go here, and so forth.

最佳答案

您可以定义以下类表示:

public class api_data
{
public string status { get; set; }

[XmlElement]
public session[] sessions { get; set; }
}

public class session
{
public int id { get; set; }
public string sessionID { get; set; }
public int gameID { get; set; }
public int maxPlayers { get; set; }
public string hostIP { get; set; }
public int hostPort { get; set; }
public int inProgress { get; set; }
public int timestamp { get; set; }
}

关键是 [XmlElement] sessions 上的标签属性,它将指示 XmlSerializer使用您提供的模式示例读取/写入 XML。要反序列化它,您可以使用 XmlSerializer因此:

//this might change, not sure how you obtain your xml, 
//but let's assume you already have it available as a string
byte[] xmlBytes = System.Text.Encoding.UTF8.GetBytes(xmlData);

var stream = new MemoryStream(xmlBytes);
XmlSerializer serializer = new XmlSerializer(typeof(api_data));
api_data apidata = (api_data)serializer.Deserialize(stream);

不需要任何更多的 XML 修饰或设置来读取它(经过测试和工作)。

编辑:尽管您可能想考虑使用其他一些 XML 属性来转换为一些更好的命名约定,我们也可以 List<Session>引导而不是阵列:

[XmlRoot("api_data")]
public class ApiData
{
[XmlElement("status")]
public string Status { get; set; }

[XmlElement("sessions")]
public List<Session> Sessions { get; set; }
}

public class Session
{
[XmlElement("id")]
public int ID { get; set; }

[XmlElement("sessionID")]
public string SessionID { get; set; }

[XmlElement("gameID")]
public int GameID { get; set; }

[XmlElement("maxPlayers")]
public int MaxPlayers { get; set; }

[XmlElement("hostIP")]
public string HostIP { get; set; }

[XmlElement("hostPort")]
public int HostPort { get; set; }

[XmlElement("inProgress")]
public int InProgress { get; set; }

[XmlElement("timestamp")]
public int TimeStamp { get; set; }
}

编辑:刚刚注意到您需要将其转换为多维数组(不知道为什么,但您指定这是遗留的)。那么此时,您已经有了一个很好的对象模型,您可以从中进行数据传输。不确定你是如何打字的,但我们假设 object现在输入数组:

ApiData apiData = DeserializeMyApiData(); // from above
array[0][0] = apiData.Status;
for(int i = 1; i <= apiData.Sessions.Count; i++)
{
var session = apiData.Sessions[i - 1];
array[i] = new object[8];
array[i][0] = session.ID;
array[i][1] = session.SessionID;
array[i][2] = session.GameID;
array[i][3] = session.MaxPlayers;
array[i][4] = session.HostIP;
array[i][5] = session.HostPort;
array[i][6] = session.InProgress;
array[i][7] = session.TimeStamp;
}

无论您有多少 session ,这都将通过并构建您的数组。

关于c# - 具有相同名称的多个元素,具有多个子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14532758/

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