2013-07-11 6 views
0

j'ai un fichier journal comme celui-ci ..données XML Lecture et stockage dans DataTable

This is the segment 1 
============================ 

<MAINELEMENT><ELEMENT1>10-10-2013 10:10:22.444</ELEMENT1><ELEMENT2>1111</ELEMENT2>  
    <ELEMENT3>Message 1</ELEMENT3></MAINELEMENT> 
<MAINELEMENT><ELEMENT1>10-10-2013 10:10:22.555</ELEMENT1><ELEMENT2>1111</ELEMENT2> 
    <ELEMENT3>Message 2</ELEMENT3></MAINELEMENT> 

This is the segment 2 
============================ 

<MAINELEMENT><ELEMENT1>10-11-2012 10:10:22.444</ELEMENT1><ELEMENT2>2222</ELEMENT2>  
    <ELEMENT3>Message 1</ELEMENT3></MAINELEMENT> 
<MAINELEMENT><ELEMENT1>10-11-2012 10:10:22.555</ELEMENT1><ELEMENT2>2222</ELEMENT2> 
    <ELEMENT3>Message 2</ELEMENT3></MAINELEMENT> 

Comment puis-je lire en DataTable à l'exclusion des données This is the segment 1 et This is the segment 2 et ====== lignes complètement.

Je voudrais avoir le Datatable comme avec des colonnes comme "ELEMENT1", "ELEMENT2", "ELEMENT3" et remplir les détails avec le contenu entre ces étiquettes dans l'ordre d'impression de la ligne.

Il ne devrait pas changer la séquence de l'ordre des enregistrements dans la table lors de l'insertion.

Répondre

1

HtmlAgilityPack semble être un bon outil pour ce que vous avez besoin:

using HtmlAgilityPack; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var doc = new HtmlDocument(); 
     doc.Load("log.txt"); 
     var dt = new DataTable(); 
     bool hasColumns = false; 
     foreach (HtmlNode row in doc 
      .DocumentNode 
      .SelectNodes("//mainelement")) 
     { 
      if (!hasColumns) 
      { 
       hasColumns = true; 
       foreach (var column in row.ChildNodes 
        .Where(node => node.GetType() == typeof(HtmlNode))) 
       { 
        dt.Columns.Add(column.Name); 
       } 
      } 
      dt.Rows.Add(row.ChildNodes 
       .Where(node => node.GetType() == typeof(HtmlNode)) 
       .Select(node => node.InnerText).ToArray()); 
     } 
    } 
} 
-1

Je ne sais pas trop où vous avez un problème.

Vous pouvez utiliser XElement pour lire le fichier XML et créer manuellement DataTable. Pour lire le XML Voir Xml Parsing using XElement

Ensuite, vous pouvez créer dynamiquement la datatable. Heres un exemple de création d'un datatable dans le code https://sites.google.com/site/bhargavaclub/datatablec

Mais pourquoi voulez-vous utiliser un DataTable? Il y a beaucoup de ... inconvénients

+0

Il peut s'agir d'une table de base de données directe, d'un tableau ou d'une base de données. Tout est OK avec moi. Fondamentalement, je veux insérer dans la base de données –

0

pourrait le faire, où est StringData les données du fichier que vous avez

var array = stringData.Split(new[] { "============================" }, StringSplitOptions.RemoveEmptyEntries); 
      var document = new XDocument(new XElement("Root")); 
      foreach (var item in array) 
      { 
       if(!item.Contains("<")) 
        continue; 
       var subDocument = XDocument.Parse("<Root>" + item.Substring(0, item.LastIndexOf('>') + 1) + "</Root>"); 
       foreach (var element in subDocument.Root.Descendants("MAINELEMENT")) 
       { 
        document.Root.Add(element); 
       } 
      } 
      var table = new DataTable(); 
      table.Columns.Add("ELEMENT1"); 
      table.Columns.Add("ELEMENT2"); 
      table.Columns.Add("ELEMENT3"); 
      var rows = 
       document.Descendants("MAINELEMENT").Select(el => 
                   { 
                    var row = table.NewRow(); 
                    row["ELEMENT1"] = el.Element("ELEMENT1").Value; 
                    row["ELEMENT2"] = el.Element("ELEMENT2").Value; 
                    row["ELEMENT3"] = el.Element("ELEMENT3").Value; 
                    return row; 
                   }); 
      foreach (var row in rows) 
      { 
       table.Rows.Add(row); 
      } 

      foreach (DataRow dataRow in table.Rows) 
      { 
       Console.WriteLine("{0},{1},{2}", dataRow["ELEMENT1"], dataRow["ELEMENT2"], dataRow["ELEMENT3"]); 
      }