将数据从html文件导入到sql数据库

时间:2013-07-03 13:46:13

标签: c# html sql

我正在尝试了解从html表中提取数据并将其导入sql表的正确或最佳方法。每周我们都会得到一个必须插入表格的html文档。我通常只使用sql管理将其导入空白表,然后将其与当前表合并。我知道一些c#所以我想创建一个自动导入器。

我正在考虑只读取每一行并通过寻找并插入这样的数据。这是最好的方式,还是有更好的方法呢?

由于

以下是html文件的示例。第1列是列名。

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style>
    br
    {mso-data-placement:same-cell;}
</style>
</head>
<body>
<table border="1">
<tr><td><b>#</b></td>
<td><b>Asset Manager</b></td>
<td><b>Billing Address</b></td>
<td><b>Billing City</b></td>
<td><b>Billing State</b></td>
<td><b>Billing Zip Code</b></td>
<td><b>Contract Amount</b></td>
<td><b>DUNS Number</b></td>
<td><b>FEIN</b></td>
</tr>
<tr>
<td>1</td>
<td  style="mso-number-format:\@">Jim Bob</td>
<td  style="mso-number-format:\@">2500 N. Park Pkwy, Suite 600</td>
<td  style="mso-number-format:\@">Plano</td>
<td>Texas</td>
<td  style="mso-number-format:\@">75093</td>
<td>$0.00</td>
<td  style="mso-number-format:\@"></td>
<td  style="mso-number-format:\@"></td>
</tr>

</table>
</body>
</html>

到目前为止,我创建了一个可以获取文档名称的按钮。还要将SQLConnection设置为正确的服务器。

private void buttonBrowse_Click(object sender, EventArgs e)
{
        var DB = new System.Windows.Forms.OpenFileDialog();
        if (DB.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            string fileToOpen = DB.FileName;
            textBoxImport.Text = fileToOpen;

        }
    }

5 个答案:

答案 0 :(得分:3)

正如其他人所提到的,你可以使用HtmlAgilityPack

以下是一个例子:

DTO:

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
    public decimal Amount { get; set; }
    // etc
}

用法:

var data = @"<html>
<head>
    <meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8"" >
<style>
    br
    {mso-data-placement:same-cell;}
</style>
</head>
<body>
<table border=""1"">
<tr><td><b>#</b></td>
<td><b>Asset Manager</b></td>
<td><b>Billing Address</b></td>
<td><b>Billing City</b></td>
<td><b>Billing State</b></td>
<td><b>Billing Zip Code</b></td>
<td><b>Contract Amount</b></td>
<td><b>DUNS Number</b></td>
<td><b>FEIN</b></td>
</tr>
<tr>
<td>1</td>
<td  style=""mso-number-format:\@"">Jim Bob</td>
<td  style=""mso-number-format:\@"">2500 N. Park Pkwy, Suite 600</td>
<td  style=""mso-number-format:\@"">Plano</td>
<td>Texas</td>
<td  style=""mso-number-format:\@"">75093</td>
<td>$0.00</td>
<td  style=""mso-number-format:\@""></td>
<td  style=""mso-number-format:\@""></td>
</tr>

</table>
</body>
</html>";

string xmlData;

// Create the document   
var document = new HtmlDocument();
document.LoadHtml(data);
document.OptionOutputAsXml = true;

// Write it to Xml so we can use XDocument Linq
using(var stream = new StringWriter())
using(var writer = XmlWriter.Create(stream))
{
    document.Save(writer);
    xmlData = stream.ToString();
}

// Use XDocument Linq to parse the xml into Customer objects
var customers = 
    XDocument.Parse(xmlData)
            .XPathSelectElements("//table/tr")
            .Skip(1)
            .Select(x => new Customer {
                Id     =     int.Parse(x.Elements("td").First().Value),
                Name   =               x.Elements("td").Skip(1).First().Value,
                Address=               x.Elements("td").Skip(2).First().Value,
                City   =               x.Elements("td").Skip(3).First().Value,
                State  =               x.Elements("td").Skip(4).First().Value,
                Zip    =               x.Elements("td").Skip(5).First().Value,
                Amount = decimal.Parse(x.Elements("td").Skip(6).First().Value,
                                       System.Globalization.NumberStyles.Currency)
            });

答案 1 :(得分:1)

解析HTML的好处是HtmlAgility Pack。 Here

答案 2 :(得分:1)

如果必须以HTML格式接收文件,我会查看可以将HTML解析为可用文档结构的第三方库(例如HTMLAgilityPack)。

使用库,您可以遍历文档并从节点中提取值,而不必尝试用丑陋的代码解析它们。

我首先要创建一个表示表中一行的类。为它提供表示表格标题的属性。然后使用HTML库获取所需的值并创建所述类的实例,设置属性值,并将它们添加到集合中。

最后,打开与数据库的连接。循环遍历类集合,并使用预处理语句将数据逐个插入数据库。

使用SqlConnection类时,请确保使用正确的处理技巧并利用using语句,以便很好地清理您的连接。

答案 3 :(得分:0)

您可以使用HtmlAgilityPack来解析Html并将其读入DataTable对象。然后,如果要传输大量数据,可以使用常规插入或SqlBulkCopy轻松地将DataTable写入数据库。

答案 4 :(得分:0)

这是你如何将HTML表的内容加载到数据表中,然后你可以从数据表中更新你的真实表...这可能是一个好的开始,试一试,你可以复制粘贴它作为控制台应用程序运行

namespace ConsoleApplication4   {
    class Program
{
    static void Main(string[] args)
    {
        XmlDocument doc = new XmlDocument();

    doc.LoadXml(@"<table border='1' cellpadding='0' cellspacing='0'>
                <tr>
                <td width='50%'>cell 1a</td>
                <td width='50%'>cell 1b</td>
                </tr>
                <tr>
                <td width='50%'>cell 2a</td>
                <td width='50%'>cell 2b</td>
                </tr>
                </table>");

    DataTable dt = new DataTable();

    dt.Columns.Add("Col1");

    dt.Columns.Add("Col2");

    foreach (XmlNode ndRow in doc.DocumentElement.ChildNodes)
    {
    DataRow dr = dt.NewRow();
    for (int colIndex = 0; colIndex < ndRow.ChildNodes.Count; colIndex++)
    dr[colIndex] = ndRow.ChildNodes[colIndex].InnerText;
    dt.Rows.Add(dr);
    }

    foreach (DataRow r in dt.Rows) {
        Console.Write(r[0] + " --- " + r[1] );
        Console.WriteLine("");
    }

    Console.ReadLine();

}
    }
}