简体   繁体   中英

empty result when parsing from xml into DataTable - c# .net

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
    );
}

dotnetfiddle

Another option is to pass the whole XML into SQL and parse it using XQuery.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM