i get an empty Datatable when parsing xml file with xmlReader and import it into one DataTable , its necessary for me to save it into Data table so i can import it later into sql server with sqlbulkcopy easily (i have huge number of lines),
what i try
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");
DataRow myDataRow;
myDataRow = dataTable.NewRow();
while (reader.Read())
{
if (reader.IsStartElement())
{
switch (reader.Name.ToString())
{
case "EventID":
myDataRow["EventID"] = reader.ReadInnerXml();
break;
case "Computer":
myDataRow["Computer"] = reader.ReadInnerXml();
break;
case "Data":
if (reader.GetAttribute("Name") == "TargetUserName")
myDataRow["TargetUserName"] = reader.ReadInnerXml();
else if (reader.GetAttribute("Name") == "TargetDomainName")
myDataRow["TargetDomainName"] = reader.ReadInnerXml();
break;
sample from 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>
Seems like this is going to be much easier to do with XDocument
and LINQ
var xDoc = XDocument.Load(path);
var table = new DataTable { Columns = {
{"EventID", typeof(string)},
{"Computer", typeof(string)},
{"TargetUserName", typeof(string)},
{"TargetDomainName", typeof(string)},
} };
foreach (var node in xDoc.Root.Elements("Event"))
{
var data = node.Element("EventData");
table.Rows.Add(
node.Element("EventID").Value,
node.Element("Computer").Value,
data.Elements().FirstOrDefault(e => e.Attribute("Name").Value == "TargetUserName").Value,
data.Elements().FirstOrDefault(e => e.Attribute("Name").Value == "TargetDomainName").Value
);
}
Another option is to pass the whole XML into SQL and parse it using XQuery.