读取XML数据并存储在DataTable中

时间:2013-07-11 11:10:47

标签: c# datatable logfile

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

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"一样,并按照行的打印顺序填充这些标记之间的内容。

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

3 个答案:

答案 0 :(得分: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 :(得分: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"]);
            }

答案 2 :(得分:-1)

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

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

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

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