将 XML 文件中的数据排序到数据集中
sorting data in XML file into a dataset
所以我有以下 xml 文件,我的 windows 表单是从网站获取的。
<WebserviceResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="">
<data xmlns="">
<ArrayOfMatches>
<Match>
<TimeSlot>17:00:00</TimeSlot>
<Game_Id>18</Game_Id>
<ArrayOfTeams>
<Team>
<Team_id>14</Team_id>
<Team_Name>New Zealand</Team_Name>
<TeamPlayers>
<Player>
<PlayerId>10</PlayerId>
<PlayerName>Trent</PlayerName>
<PlayerSurname>Boult</PlayerSurname>
</Player>
<Player>...</Player>
<Player>...</Player>
<Player>...</Player>
</TeamPlayers>
</Team>
<Team>
<Team_id>16</Team_id>
<Team_Name>west indies</Team_Name>
<TeamPlayers>...</TeamPlayers>
</Team>
</ArrayOfTeams>
</Match>
</ArrayOfMatches>
</data>
这只是整个事情的一小部分,这里的想法是两支队伍要面对面,分配一个 Game_Id
我目前的想法是将 Game_Id
Team_Id
和 Team_Name
全部加载到一行数据集中,对于每个 Game_Id
( xml 文件中有不止一款游戏)。团队名称最终将以 Team1 V Team2 的形式出现在组合框中; then when one is selected the Player
elements will be loaded into 2 separate list boxes.
我现在能做的是用 TimeSlot
和 Game_Id
填充不同的数据集,xml 文件中的所有 TeamPlayers
使用 DS.ReadXML(xmlRead)
,但不是我想要的方式,并将 Game_Id
放入组合框中:
XmlElement root = xdoc.DocumentElement;
XmlNodeList nodeList = xdoc.GetElementsByTagName("Match");
foreach (XmlNode xn in nodeList)
{
cb_matches.Items.Add(xn.InnerText);
}
这些都有效,但不是我想要做的。
如有任何帮助,我们将不胜感激,我确实觉得我已经尽可能多地在此处提供了信息。
已编辑
<Date> </Date>
每个网络服务只出现一次,当天有多个 <Game_Id>
。它用于确保使用了正确的 XML 文件。
已编辑
<data xmlns="">
<ArrayOfMatches>
<Match>...</Match>
<Match>...</Match>
</ArrayOfMatches>
</data>
已编辑
所以我仍然在为此苦苦挣扎。
+-----+-------+---------+------------+---------+-----------+
|Time |Game_Id|Team_A_Id|Team_A_Name |Team_B_Id|Team_B_Name|
|17:00|18 |14 |South Africa|16 |West Indies|
|19:00|19 |18 |New Zealand |12 |England |
这就是我想要的 DataTable
结构
现在我一直在玩 xml-linq 等,但我似乎不能那样布置它。
XDocument xdoc = XDocument.Load(@"c:/matchdata.xml");
IEnumerable<XElement> games = xdoc.Descendants("ArrayOfMatches");
var matches = games
.Select(x => new Games()
{
GameID = x.Element("Game_Id").Value,
TeamAID = x.Element("Team_Id").Value,
TeamAName = x.Element("Team_Name").Value,
TeamBID = x.Element("Team_Id").Value,
TeamBName = x.Element("Team_Name").Value
});
dataGridView1.DataSource = xdoc;
这可以编译,但不会在 gridview
中显示任何数据,也不会显示任何错误。
您可以将整个 XML 反序列化为一个对象并轻松使用它
(我从你的 xml 代码片段中删除了第一行,匹配项是一个条目,因为如果有多个匹配项,则不清楚日期将去哪里,
<data>
<ArrayOfMatches>
<Date>2017-04-04</Date>
<Match>
<TimeSlot>17:00:00</TimeSlot>
<Game_Id>18</Game_Id>
<ArrayOfTeams>
<Team>
<Team_id>14</Team_id>
<Team_Name>New Zealand</Team_Name>
<TeamPlayers>
<Player>
<PlayerId>10</PlayerId>
<PlayerName>Trent</PlayerName>
<PlayerSurname>Boult</PlayerSurname>
</Player>
<Player>
<PlayerId>11</PlayerId>
<PlayerName>Trent</PlayerName>
<PlayerSurname>Boult</PlayerSurname>
</Player>
<Player>
<PlayerId>12</PlayerId>
<PlayerName>Trent</PlayerName>
<PlayerSurname>Boult</PlayerSurname>
</Player>
</TeamPlayers>
</Team>
<Team>
<Team_id>15</Team_id>
<Team_Name>New Zealand</Team_Name>
<TeamPlayers>
<Player>
<PlayerId>10</PlayerId>
<PlayerName>Trent</PlayerName>
<PlayerSurname>Boult</PlayerSurname>
</Player>
<Player>
<PlayerId>11</PlayerId>
<PlayerName>Trent</PlayerName>
<PlayerSurname>Boult</PlayerSurname>
</Player>
<Player>
<PlayerId>12</PlayerId>
<PlayerName>Trent</PlayerName>
<PlayerSurname>Boult</PlayerSurname>
</Player>
</TeamPlayers>
</Team>
</ArrayOfTeams>
</Match>
</ArrayOfMatches>
</data>
但你应该明白了)
现在您可以使用 result
。
通过获取 game_id、球队数组、球员等属性
public class data
{
public DateTime Date { get; set; }
public Match[] ArrayOfMatches { get; set; }
}
public class ArrayOfMatches
{
public Match[] Match { get; set; }
}
public class Match
{
public String TimeSlot { get; set; }
public int Game_Id { get; set; }
public Team[] ArrayOfTeams { get; set; }
}
public class Team {
public int Team_id { get; set; }
public string Team_Name { get; set; }
public Player[] TeamPlayers { get; set; }
}
public class Player
{
public int PlayerId { get; set; }
public string PlayerName { get; set; }
public string PlayerSurname { get; set; }
}
class Program
{
static void Main(string[] args)
{
using (FileStream fileStream = new FileStream(@"C:\temp\input.xml", FileMode.Open))
{
XmlSerializer serializer = new XmlSerializer(typeof(data));
data result = (data)serializer.Deserialize(fileStream);
}
}
}
var dt = new DataTable();
dt.Columns.Add(new DataColumn("TimeSlot", typeof(string)));
dt.Columns.Add(new DataColumn("GameID", typeof(string)));
dt.Columns.Add(new DataColumn("TeamAID", typeof(string)));
dt.Columns.Add(new DataColumn("TeamAName", typeof(string)));
dt.Columns.Add(new DataColumn("TeamBID", typeof(string)));
dt.Columns.Add(new DataColumn("TeamBName", typeof(string)));
XDocument xdoc = XDocument.Load(@"c:/matchdata.xml");
var games = from i in xdoc.Descendants("Match")
select new //creates a few new anonymous types to store values to dump into the datatable
{
TimeSlot = (string)i.Element("TimeSlot"),
GameID = (string)i.Element("Game_Id"),
TeamAID = (string)i.Element("ArrayOfTeams").Element("Team").Element("Team_id"),
TeamAName = (string)i.Element("ArrayOfTeams").Element("Team").Element("Team_Name"),
TeamBID = (string)i.Element("ArrayOfTeams").Elements("Team").Skip(1).First().Element("Team_id"), //skips a node to collect info for the next team.
TeamBName = (string)i.Element("ArrayOfTeams").Elements("Team").Skip(1).First().Element("Team_Name") //skips a node to collect info for the next team.
};
foreach (var item in games)
{
dt.Rows.Add(item.TimeSlot, item.GameID, item.TeamAID, item.TeamAName, item.TeamBID, item.TeamBName); //adds a new row of data into the datatable for every <Match> </Match>
}
如此有效,dt
可以成为 gridview
的来源,您可以看到结果。这可能不是最好的方法,但至少我学到了一些东西,将查看对 better/more 高效的评论。
所以我有以下 xml 文件,我的 windows 表单是从网站获取的。
<WebserviceResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="">
<data xmlns="">
<ArrayOfMatches>
<Match>
<TimeSlot>17:00:00</TimeSlot>
<Game_Id>18</Game_Id>
<ArrayOfTeams>
<Team>
<Team_id>14</Team_id>
<Team_Name>New Zealand</Team_Name>
<TeamPlayers>
<Player>
<PlayerId>10</PlayerId>
<PlayerName>Trent</PlayerName>
<PlayerSurname>Boult</PlayerSurname>
</Player>
<Player>...</Player>
<Player>...</Player>
<Player>...</Player>
</TeamPlayers>
</Team>
<Team>
<Team_id>16</Team_id>
<Team_Name>west indies</Team_Name>
<TeamPlayers>...</TeamPlayers>
</Team>
</ArrayOfTeams>
</Match>
</ArrayOfMatches>
</data>
这只是整个事情的一小部分,这里的想法是两支队伍要面对面,分配一个 Game_Id
我目前的想法是将 Game_Id
Team_Id
和 Team_Name
全部加载到一行数据集中,对于每个 Game_Id
( xml 文件中有不止一款游戏)。团队名称最终将以 Team1 V Team2 的形式出现在组合框中; then when one is selected the Player
elements will be loaded into 2 separate list boxes.
我现在能做的是用 TimeSlot
和 Game_Id
填充不同的数据集,xml 文件中的所有 TeamPlayers
使用 DS.ReadXML(xmlRead)
,但不是我想要的方式,并将 Game_Id
放入组合框中:
XmlElement root = xdoc.DocumentElement;
XmlNodeList nodeList = xdoc.GetElementsByTagName("Match");
foreach (XmlNode xn in nodeList)
{
cb_matches.Items.Add(xn.InnerText);
}
这些都有效,但不是我想要做的。
如有任何帮助,我们将不胜感激,我确实觉得我已经尽可能多地在此处提供了信息。
已编辑
<Date> </Date>
每个网络服务只出现一次,当天有多个 <Game_Id>
。它用于确保使用了正确的 XML 文件。
已编辑
<data xmlns="">
<ArrayOfMatches>
<Match>...</Match>
<Match>...</Match>
</ArrayOfMatches>
</data>
已编辑
所以我仍然在为此苦苦挣扎。
+-----+-------+---------+------------+---------+-----------+
|Time |Game_Id|Team_A_Id|Team_A_Name |Team_B_Id|Team_B_Name|
|17:00|18 |14 |South Africa|16 |West Indies|
|19:00|19 |18 |New Zealand |12 |England |
这就是我想要的 DataTable
现在我一直在玩 xml-linq 等,但我似乎不能那样布置它。
XDocument xdoc = XDocument.Load(@"c:/matchdata.xml");
IEnumerable<XElement> games = xdoc.Descendants("ArrayOfMatches");
var matches = games
.Select(x => new Games()
{
GameID = x.Element("Game_Id").Value,
TeamAID = x.Element("Team_Id").Value,
TeamAName = x.Element("Team_Name").Value,
TeamBID = x.Element("Team_Id").Value,
TeamBName = x.Element("Team_Name").Value
});
dataGridView1.DataSource = xdoc;
这可以编译,但不会在 gridview
中显示任何数据,也不会显示任何错误。
您可以将整个 XML 反序列化为一个对象并轻松使用它 (我从你的 xml 代码片段中删除了第一行,匹配项是一个条目,因为如果有多个匹配项,则不清楚日期将去哪里,
<data>
<ArrayOfMatches>
<Date>2017-04-04</Date>
<Match>
<TimeSlot>17:00:00</TimeSlot>
<Game_Id>18</Game_Id>
<ArrayOfTeams>
<Team>
<Team_id>14</Team_id>
<Team_Name>New Zealand</Team_Name>
<TeamPlayers>
<Player>
<PlayerId>10</PlayerId>
<PlayerName>Trent</PlayerName>
<PlayerSurname>Boult</PlayerSurname>
</Player>
<Player>
<PlayerId>11</PlayerId>
<PlayerName>Trent</PlayerName>
<PlayerSurname>Boult</PlayerSurname>
</Player>
<Player>
<PlayerId>12</PlayerId>
<PlayerName>Trent</PlayerName>
<PlayerSurname>Boult</PlayerSurname>
</Player>
</TeamPlayers>
</Team>
<Team>
<Team_id>15</Team_id>
<Team_Name>New Zealand</Team_Name>
<TeamPlayers>
<Player>
<PlayerId>10</PlayerId>
<PlayerName>Trent</PlayerName>
<PlayerSurname>Boult</PlayerSurname>
</Player>
<Player>
<PlayerId>11</PlayerId>
<PlayerName>Trent</PlayerName>
<PlayerSurname>Boult</PlayerSurname>
</Player>
<Player>
<PlayerId>12</PlayerId>
<PlayerName>Trent</PlayerName>
<PlayerSurname>Boult</PlayerSurname>
</Player>
</TeamPlayers>
</Team>
</ArrayOfTeams>
</Match>
</ArrayOfMatches>
</data>
但你应该明白了)
现在您可以使用 result
。
通过获取 game_id、球队数组、球员等属性
public class data
{
public DateTime Date { get; set; }
public Match[] ArrayOfMatches { get; set; }
}
public class ArrayOfMatches
{
public Match[] Match { get; set; }
}
public class Match
{
public String TimeSlot { get; set; }
public int Game_Id { get; set; }
public Team[] ArrayOfTeams { get; set; }
}
public class Team {
public int Team_id { get; set; }
public string Team_Name { get; set; }
public Player[] TeamPlayers { get; set; }
}
public class Player
{
public int PlayerId { get; set; }
public string PlayerName { get; set; }
public string PlayerSurname { get; set; }
}
class Program
{
static void Main(string[] args)
{
using (FileStream fileStream = new FileStream(@"C:\temp\input.xml", FileMode.Open))
{
XmlSerializer serializer = new XmlSerializer(typeof(data));
data result = (data)serializer.Deserialize(fileStream);
}
}
}
var dt = new DataTable();
dt.Columns.Add(new DataColumn("TimeSlot", typeof(string)));
dt.Columns.Add(new DataColumn("GameID", typeof(string)));
dt.Columns.Add(new DataColumn("TeamAID", typeof(string)));
dt.Columns.Add(new DataColumn("TeamAName", typeof(string)));
dt.Columns.Add(new DataColumn("TeamBID", typeof(string)));
dt.Columns.Add(new DataColumn("TeamBName", typeof(string)));
XDocument xdoc = XDocument.Load(@"c:/matchdata.xml");
var games = from i in xdoc.Descendants("Match")
select new //creates a few new anonymous types to store values to dump into the datatable
{
TimeSlot = (string)i.Element("TimeSlot"),
GameID = (string)i.Element("Game_Id"),
TeamAID = (string)i.Element("ArrayOfTeams").Element("Team").Element("Team_id"),
TeamAName = (string)i.Element("ArrayOfTeams").Element("Team").Element("Team_Name"),
TeamBID = (string)i.Element("ArrayOfTeams").Elements("Team").Skip(1).First().Element("Team_id"), //skips a node to collect info for the next team.
TeamBName = (string)i.Element("ArrayOfTeams").Elements("Team").Skip(1).First().Element("Team_Name") //skips a node to collect info for the next team.
};
foreach (var item in games)
{
dt.Rows.Add(item.TimeSlot, item.GameID, item.TeamAID, item.TeamAName, item.TeamBID, item.TeamBName); //adds a new row of data into the datatable for every <Match> </Match>
}
如此有效,dt
可以成为 gridview
的来源,您可以看到结果。这可能不是最好的方法,但至少我学到了一些东西,将查看对 better/more 高效的评论。