<players>
<player>
<playerName>Guest</playerName>
<playerID>1</playerID>
<highScore>0</highScore>
<levels>
<level>
<number>111</number>
<bestTime>222</bestTime>
<timesCompleted>333</timesCompleted>
</level>
<level>
<number>112</number>
<bestTime>113</bestTime>
<timesCompleted>114</timesCompleted>
</level>
</levels>
</player>
<player>
<playerName>Guest2</playerName>
<playerID>2</playerID>
<highScore>0</highScore>
<levels>
<level>
<number>111</number>
<bestTime>221</bestTime>
<timesCompleted>441</timesCompleted>
</level>
</levels>
</player>
</players>
嗨!
所以我有上面列出的 XML 结构,并尝试在 C#/XNA 中解析它,这样我就有变量中的名称、ID 和最高分,然后将级别数据(记住每个玩家有多个级别)转换为数组列表(目前),如下所示:
[[111,222,333][112,113,114]],[[111,221,441]]
或者是一个 3D 锯齿状数组,我猜。
到目前为止我有以下代码:
double[][] test = xDoc.Root.Elements("player").Elements("levels").Elements("level")
.Select(level => level.Elements().Select(x => (double)x).ToArray())
.ToArray();
但显然这是一个 2D 数组,并且似乎只给了我第一个玩家的结果 - 但我不知道如何概括它。有什么想法吗?
最佳答案
这将为您提供 3D 数组并遍历所有节点
var playersNode = myDocument.ChildNodes.OfType<XmlElement>().Where(nodeVariant => nodeVariant.Name == "players").First();
var levelsNode = playersNode.ChildNodes.OfType<XmlElement>().Select(nodeVariant => nodeVariant.ChildNodes.OfType<XmlElement>().Where(nodeVariant1 => nodeVariant1.Name == "levels"));
double[][][] output = levelsNode.Select(o => o.ChildNodes.OfType<XmlElement>().Select(o1 => new[] { Convert.ToDouble(o.Attributes["number"]), Convert.ToDouble(o.Attributes["bestTime"]), Convert.ToDouble(o.Attributes["timesCompleted"]) }).ToArray()).ToArray();
关于c# - 将嵌套 XML 转换为 3d 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21503661/