【问题标题】:How do I store parsed HTML into a database and compare values within the database如何将解析的 HTML 存储到数据库中并比较数据库中的值
【发布时间】:2016-03-04 05:12:34
【问题描述】:

我的数据库有如下字段: ID(nvarchar),开始日期(日期),结束日期(日期),状态(位)

我目前正在从网站解析 HTML,以便比较 2 个值(1 个来自本地数据库,另一个来自网站)以确定它们是否相同。如果它们是相同的值 - 完美。但是,如果日期或状态相差超过 7 天,或者状态显示为非活动而不是活动(反之亦然),我希望它“添加到最终报告”,在它通过所有值之后在桌面上存储一个 report.txt 文件(还不确定)

        SqlConnection conn = new SqlConnection(Properties.Settings.Default.LenovoWarrantyConnectionString);
        conn.Open();
        ArrayList lenovolist = new ArrayList();
        SqlCommand myCommand = conn.CreateCommand();
        myCommand.CommandText = ("SELECT SerialNumber from Warranty");
        SqlDataReader myReader = myCommand.ExecuteReader();
        int count = myReader.FieldCount;

        while (myReader.Read())
        {
            for (int i = 0; i < count; i++)
            {
                //Loop through Serial Numbers
                string result = myReader.GetValue(i).ToString();
                //Iterate through Lenovo's Serial Checker 1 by 1
                webBrowser1.Document.GetElementById("serialCode").Focus();
                webBrowser1.Document.GetElementById("serialCode").InnerText = result;
                webBrowser1.Document.GetElementById("warrantySubmit").InvokeMember("Click");
                Thread.Sleep(500);
                MessageBox.Show("Script Completed");
                //Get System Summary Info
                foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("div"))
                    if (el.GetAttribute("className") == "fluid-row firstfluid")
                    {
                        var record = el.InnerText;
                        lenovolist.Add(record);
                        //MessageBox.Show(record, "System Summary");
                    }
                //Get Base Warranty, Warranty Upgrade, and Priority Support
                foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("div"))
                    if (el.GetAttribute("className") == "fluid-row Borderfluid")
                    {
                        var record1 = el.InnerText;
                        lenovolist.Add(record1);
                        MessageBox.Show(record1, "Base Warranty, Warranty Upgrade, Priority Support");
                    }
            }
        }
        foreach (var items in lenovolist)
        {
            MessageBox.Show(items.ToString());
        }

我的数据库中有大约 300~ 行。

起初我考虑将解析后的 H​​TML 存储在数组列表中以便与数据库进行比较 - 我现在需要将解析后的信息存储到数据库中(除非日期/状态不同)

在此先感谢您提供的任何帮助

【问题讨论】:

  • 目前还不清楚你到底卡在哪里。理想情况下,您将构建一个代表数据的一个“对象”(少数值)的类。该类将包含比较它们的逻辑。根据您在数据库中的内容构造一个类的实例,根据您在 HTML 中的内容构造另一个实例,然后比较该类的两个实例。看来您可能过于复杂了。
  • 你能告诉我一个比较它们的逻辑示例吗?我不太确定如何,我似乎无法找到可靠的资源
  • 嗯,你已经描述了一些逻辑:"if the dates or status are different by over 7 days or Status shows Inactive instead of Active" 你是在问如何比较两个DateTime 值来查看它们是否相隔超过 7 天?如何比较两个字符串值以查看它们是否不同?老实说,目前还不清楚问题是什么。
  • 很抱歉没有解释,但对他们俩都是。我不知道如何处理它。例如,我数据库中的日期是 DD/MM/YYYY,其中我解析的 HTML 字符串是 YYYY/MM/DD。这个问题是我不知道如何将我解析的字符串分开?如何分离我解析的字符串并将其与相应的数据库对应项进行比较? ---- 在字符串中有 6 个关键日期,但我不知道如何将它们与数据库中的 6 个日期进行比较
  • 你不会“把它拆开”。您将这两个值都转换为 DateTime 对象并比较这些对象。您可以使用&gt;&lt;== 等运算符来比较值。

标签: c# html mysql parsing compare


【解决方案1】:

我认为这里有一个关于如何处理数据的困惑:

1) 数据属于数据层(在您的情况下为 MySql 服务器),并且应该几乎总是只存储数据,而不是与演示相关的信息

2) Html 代码属于表现层(提供给浏览器显示信息)

好的,理论说得够多了。在你的情况下:

1) 为从 Web 获取的数据定义一个表。例如。

网络数据

ProductId INT
TheDate DATE
SerialCode VARCHAR(128)

2) 在插入 WebData 表之前解析 Html 文件并转换数据。日期可以使用 DateTime.ParseDateTime.TryParse 或精确的对应项 - DateTime.ParseExactDateTime.TryParseExact 进行解析(我推荐最后一个)。

3) 您可以发出如下所示的选择(DateDiff 用于检查该时间跨度)

SELECT (CASE WHEN DATEDIFF(W.TheDate, P.EndDate) > 7 THEN 0 ELSE 1 END) AS IsActive, <other info here>
FROM Product P
   INNER JOIN WebData W ON W.ProductId = P.ProductId

当然,这可以转化为更新来维护Status

【讨论】:

  • 1) 我是个白痴,我不知道为什么我没有想到这一点 - 我被卡住了,我开始想太多了。 2) 我从网上出来的日期 YYYY/MM/DD 可以 DateTime.TryParseExact 自动转换为 DD/MM/YYYY?。 3) 最后一行是一个内连接,对吗?
  • 2) TryParse/Exact 几乎可以将任何字符串表示形式转换为 DateTime。强烈建议将日期时间作为 DateTime 存储在数据库中,以便轻松进行计算、排序等。DD/MM/YYYY 只是显示日期(演示文稿)的一种方式。是的,INNER JOIN(我会修复它,因为我习惯于 T-SQL 隐含 INNER)。
  • 所以我正在创建的程序循环通过大约 300~ 个序列 - 所以每次循环时我都应该将我解析的 html 字符串转换为字符串 + 日期时间并将这些值存储到我数据库中的单独表中 -在所有循环完成之后,我应该在两个表之间进行比较。这是正确的吗?
  • 是的,解析html字符串,将数据存储在表格中,然后您可以比较表格(如果逻辑往往比描述的更复杂,可以在存储过程中完成)。
  • 谢谢 - 我对使用数据库比较陌生,感谢所有帮助!逻辑差不多 - 比较序列号 if(serialnumbers match){比较日期 + 比较状态} - 最后,如果有任何日期/状态返回不同,我需要将其添加到程序将发出警报的报告中用户每周。 (该程序将在每天早上 5 点自动运行,并在每周的 x 个时间给出报告作为更新) -- 完成比较后我仍然需要执行该步骤
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多