0

我有一个这样的日志文件..

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使用 Columns as"ELEMENT1", "ELEMENT2", "ELEMENT3"并按照打印行的顺序用这些标签之间的内容填充详细信息。

插入时不应该改变表中记录的顺序。

4

3 回答 3

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());
        }
    }
}
于 2013-07-11T11:45:46.853 回答
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"]);
            }
于 2013-07-11T11:48:34.767 回答
-1

我不太确定你的问题出在哪里。

您可以使用 XElement 读取 xml 并手动创建 DataTable。如需阅读 XML,请参阅Xml Parsing using XElement

然后您可以动态创建数据表。下面是在代码https://sites.google.com/site/bhargavaclub/datatablec中创建数据表的示例

但是为什么要使用 DataTable 呢?有很多缺点...

于 2013-07-11T11:15:05.410 回答