1

HTMLテーブルからデータを取得してSQLテーブルにインポートするための適切な方法または最良の方法を学ぼうとしています。毎週、テーブルに挿入する必要がある html ドキュメントを受け取ります。私は通常、SQL 管理を使用して空白のテーブルにインポートし、現在のテーブルとマージします。私はいくつかのC#を知っているので、少し自動化するインポーターを作成したかった.

私はちょうど各行を読んで、そのようなデータを探して挿入することを考えていました。それが最善の方法ですか、それとももっと良い方法はありますか?

ありがとう

html ファイルの例を次に示します。最初の列は列名です。

<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;

        }
    }
4

5 に答える 5

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)
            });
于 2013-07-03T14:16:26.813 に答える
1

HTML の解析に適しているのは HtmlAgility Pack です。ここ

于 2013-07-03T13:50:53.970 に答える
0

HtmlAgilityPackを使用して Html を解析し、それをDataTableオブジェクトに読み込むことができます。大量のデータを転送する場合は、通常の挿入またはSqlBulkCopyを使用して、DataTable をデータベースに簡単に書き込むことができます。

于 2013-07-03T13:50:45.337 に答える
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();

}
    }
}
于 2013-07-03T14:28:04.063 に答える