读取XML数据并存储在DataTable中

本文关键字:DataTable 存储 XML 数据 读取 | 更新日期: 2023-09-27 18:21:53

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

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>

如何将其完全读取到不包括数据This is the segment 1This is the segment 2======行的DataTable中。

我想把Datatable和Columns作为"ELEMENT1", "ELEMENT2", "ELEMENT3",并按照行的打印顺序用这些标签之间的内容填充细节。

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

读取XML数据并存储在DataTable中

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

可以做到这一点,其中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"]);
            }

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

您可以使用XElement读取xml并手动创建DataTable。有关读取XML,请参阅使用XElement 的XML解析

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

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