2013-07-11 40 views
0

存儲我有一個這樣的日誌文件..讀取XML數據和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> 

我怎麼能看這種成DataTable排除數據This is the segment 1This is the segment 2======線完全。

我希望Datatable與列"ELEMENT1", "ELEMENT2", "ELEMENT3"一樣,並按照行的打印順序填充這些標記之間的內容。

插入時不應該改變表中記錄順序的順序。

回答

1

HtmlAgilityPack似乎是你所需要的一個很好的工具:

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

我不太確定你的問題在哪裏。

您可以使用XElement讀取xml並手動創建DataTable。 用於讀取XML請參閱Xml Parsing using XElement

然後您可以動態創建數據表。 繼承人在代碼中創建數據表的示例 https://sites.google.com/site/bhargavaclub/datatablec

但是,爲什麼要使用DataTable?有很多缺點的...

+0

它可以是直接數據庫表,數組或數據表。對我而言,任何事情都可以。基本上我想插入數據庫 –

0

能做到這一點,其中StringData是從文件中的數據必須

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