C# 将XML文件中的数据排序到数据集中
因此,我有下面的xml文件,我的windows窗体从一个网站获取C# 将XML文件中的数据排序到数据集中,c#,winforms,dataset,linq-to-xml,C#,Winforms,Dataset,Linq To Xml,因此,我有下面的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>1
<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>
这些都是工作,但这不是我想做的
在这件事上的任何帮助都将不胜感激,我确实觉得我已经在这里尽可能多的信息,我可以
已编辑
<data xmlns="">
<ArrayOfMatches>
<Match>...</Match>
<Match>...</Match>
</ArrayOfMatches>
</data>
每个web服务只显示一次
,一天中有多个
。它用于确保使用了正确的XML文件
已编辑
<data xmlns="">
<ArrayOfMatches>
<Match>...</Match>
<Match>...</Match>
</ArrayOfMatches>
</data>
这就是我想要在我的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;
XDocument xdoc=XDocument.Load(@“c:/matchdata.xml”);
IEnumerable games=xdoc.substands(“ArrayOfMatches”);
变量匹配=游戏
.选择(x=>新游戏()
{
GameID=x.Element(“Game_Id”)。值,
TeamAID=x.元素(“团队Id”).值,
TeamAName=x.Element(“团队名称”)。值,
TeamBID=x.Element(“团队Id”)。值,
TeamBName=x.Element(“团队名称”).值
});
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>
var dt=new DataTable();
Add(新的数据列(“时隙”,typeof(字符串));
Add(新的数据列(“GameID”,typeof(string));
添加(新数据列(“TeamAID”,typeof(string));
Add(新的数据列(“TeamAName”,typeof(string));
添加(新的数据列(“TeamBID”,typeof(string));
添加(新的数据列(“TeamBName”,typeof(string));
XDocument xdoc=XDocument.Load(@“c:/matchdata.xml”);
var games=来自xdoc.substands中的i(“匹配”)
选择new//创建一些新的匿名类型来存储要转储到datatable中的值
{
时隙=(字符串)i.Element(“时隙”),
GameID=(字符串)i.Element(“Game_Id”),
TeamAID=(字符串)i.Element(“ArrayOfTeams”).Element(“团队”).Element(“团队id”),
TeamAName=(字符串)i.Element(“ArrayOfTeams”).Element(“团队”).Element(“团队名称”),
TeamBID=(字符串)i.Element(“ArrayOfTeams”).Elements(“团队”).Skip(1).First().Element(“团队id”),//跳过节点以收集下一个团队的信息。
TeamBName=(string)i.Element(“ArrayOfTeams”).Elements(“Team”).Skip(1).First().Element(“Team_Name”)//跳过节点以收集下一个团队的信息。
};
foreach(游戏中的var项目)
{
dt.Rows.Add(item.TimeSlot、item.GameID、item.TeamAID、item.TeamAName、item.TeamBID、item.TeamBName);//为每个
}
因此,这是可行的,
dt
可以成为gridview
的源代码,您可以看到结果。这可能不是最好的方法,但至少我学到了一些东西,关于更好/更有效的方法的评论将被查看。每个web服务的数据元素都是唯一的。只是在玩多个游戏的那一天。现在,我将对此进行一次痛击。感谢回复。日期,而不是数据。如果这造成了任何混乱,我深表歉意。是的,这仍然让我有点困惑。无法在ArrayOfMatches级别正确捕获日期。你能提供我从web上获得的确切xml吗?据我所知,日期应该是在匹配标记内,或者t在ArrayOfMatches标记之外,XML代码是从原始区域复制粘贴的,我刚刚删除了“多余数据”如玩家名称等,使其更短。请参阅新编辑。问题是,如果有多个匹配项,则无法匹配和。如果有多个游戏ID,则无法匹配,并且。一旦有了结构,所有这些都将变得不相关。反序列化将不起作用。您必须手动解析它。关联内容按顺序。
<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>
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>
}