XML解析存入DataTable时数据全在单列,如何按类分列存储?
XML解析到DataTable的列映射问题
问题说明
解析XML文件并存入DataTable时,所有数据都被存储到同一列中,需要实现每个字段对应DataTable的一列。尝试直接解析到DataTable返回空结果,转而先将数据存入实体类再转换到DataTable是可行方案,但不清楚指定列插入的语法。
问题已由@jdweng解决,若遇到Value cannot be null. (Parameter 'element')错误,可尝试使用语句:
int EventID = (int)xEvent.Descendants("EventID").FirstOrDefault();
代码示例
using (XmlReader reader = XmlReader.Create(@"C:\Users\neyma\test/W.xml")) { DataTable dataTable = new DataTable(); dataTable.Columns.Add("EventID"); dataTable.Columns.Add("Computer"); dataTable.Columns.Add("TargetUserName"); dataTable.Columns.Add("TargetDomainName"); while (reader.Read()) { if (reader.IsStartElement()) { switch (reader.Name.ToString()) { case "EventID": data.EventID= reader.ReadInnerXml(); dt.Rows.Add(data.EventID); break; case "Computer": data.Computer= reader.ReadInnerXml(); dt.Rows.Add(data.Computer); break; case "Data": if (reader.GetAttribute("Name") == "TargetUserName") data.TargetUserName= reader.ReadInnerXml(); dt.Rows.Add(data.TargetUserName); else if (reader.GetAttribute("Name") =="TargetDomainName") data.TargetDomainName= reader.ReadInnerXml(); dt.Rows.Add(data.TargetDomainName); break; } } } Console.WriteLine(string.Join("\r\n", dt.Rows.Cast<DataRow>().Select(r => string.Join(", ", r.ItemArray)))); }
当前输出
5136, , , , , , , , , , , , , , , , , , , , , 851215101, , , , , , , , , , , , , , , , , , , , , 5136, , , , , , , , , , , , , , , , , , , , , 851215100, , , , , , , , , , , , , , , , , , , , , ...
期望输出
5136, 851215098, , , , , , , , , , , , , , , , , , , , 851215101, 5136, , , , , , , , , , , , , , , , , , , , ...
XML示例
<eventxml> <Event><EventID>36</EventID><Computer>NH</Computer><EventData><Data Name="TargetUserName">TER.go</Data><Data Name="TargetDomainName">%4</Data></EventData></Event> <Event><EventID>51</EventID><Computer>NQ-RS1-.ov</Computer><EventData><Data Name="TargetUserName">TERMSRiv</Data><Data Name="TargetDomainName">%%4</Data></EventData></Event> <Event><EventID>536</EventID><Computer>CRS1.ov</Computer><EventData><Data Name="TargetUserName">TERRov</Data><Data Name="TargetDomainName">%%144</Data></EventData></Event> </eventxml>
内容的提问来源于stack exchange,提问作者call out my name
相关产品推荐
相关产品推荐

