【问题标题】:Reading XML and storing it in SQL Server. Getting duplicates读取 XML 并将其存储在 SQL Server 中。获取重复项
【发布时间】:2016-10-22 16:07:47
【问题描述】:

我正在尝试从 URL 读取 XML 提要并将其存储在数据库中。 XML 格式如下所示:

<response version="2">
  <totalresults>1249943</totalresults>
  <results>
    <result>
      <jobtitle>Call Center </jobtitle>
      <company>CVS Health</company>
      <city>Work at Home</city>
    </result>

    <result>
      <jobtitle>Java Programmer</jobtitle>
      <company>Jonah Group</company>
      <city>Toronto</city>
    </result>
  </results>
</response>

我正在尝试存储所有工作的职位名称、公司和城市。有数以百万计的工作。这是我在 C# 中的代码

public override void getJobsFromSource()
{
    string url = @"http://api.indeed.com/ads/apisearch?publisher=5566998848654317&v=2&q=%22%22&filter=1%22%22&limit=25";
    XmlDocument doc = new XmlDocument();
    doc.Load(url);
    int totalResults = int.Parse(doc.SelectSingleNode("response /totalresults").InnerText);

    for (int i = 0; i < totalResults; i += 25)
    {
        string newUrl = $@"http://api.indeed.com/ads/apisearch?publisher=5566998848654317&v=2&q=%22%22&filter=1&limit=25&start={i}";
        doc.Load(newUrl);
        DataSet ds = new DataSet();
        XmlNodeReader xmlReader = new XmlNodeReader(doc);

        while (xmlReader.ReadToFollowing("results"))
        {
            ds.ReadXml(xmlReader);
        }

        if (ds.Tables.Count > 0)
        {
            SqlConnection con = new SqlConnection();
            con.ConnectionString = "data source=10.0.0.76;initial catalog=JobSearchDB;persist security info=True;user id=sa;password=bonddbl07;MultipleActiveResultSets=True;App=EntityFramework";
            con.Open();

            SqlBulkCopy sbc = new SqlBulkCopy(con);
            sbc.DestinationTableName = "IndeedJob";

            sbc.ColumnMappings.Clear();
            sbc.ColumnMappings.Add("jobtitle", "jobtitle");
            sbc.ColumnMappings.Add("company", "company");
            sbc.ColumnMappings.Add("city", "city");
            sbc.WriteToServer(ds.Tables[0]);
            con.Close();
        }
    }
}

问题是,虽然工作是独一无二的,但我的表格中有很多重复项。每当我运行程序时,重复项都会以随机数出现。哪里出错了?

【问题讨论】:

  • 使用网络浏览器访问 url。您只使用公司经常在同一标题下发布许多职位的职位。使用 jobkey 获取每个发布的唯一编号。
  • 我没有在我的问题中显示所有标签。标签之一是 并且是唯一的。事实上,网站为每个工作分配了一个唯一的密钥。但是在我的表中,我看到许多具有相同工作密钥的重复项。

标签: c# xml


【解决方案1】:

网页肯定有重复。我用下面的代码验证了。该网页似乎没有格式正确的 xml,因此我不得不修改您的代码才能读取网页。使用 Linq,我能够删除重复项。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Schema;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        DataSet ds = new DataSet("Jobs");
        public Form1()
        {
            InitializeComponent();
            getJobsFromSource();
            DataTable dt = ds.Tables[0];
            dt = dt.AsEnumerable().GroupBy(x => x.Field <string>("jobkey")).Select(x => x.FirstOrDefault()).OrderBy(y => y.Field<string>("jobkey")).CopyToDataTable();
            dataGridView1.DataSource = dt;
        }
        public void getJobsFromSource()
{
            string url = @"http://api.indeed.com/ads/apisearch?publisher=5566998848654317&v=2&q=%22%22&filter=1%22%22&limit=25";
            XmlDocument doc = new XmlDocument();
            doc.Load(url);
            int totalResults = int.Parse(doc.SelectSingleNode("response /totalresults").InnerText);
            for (int i = 0; i < totalResults; i += 25)
            {
                string newUrl = @"http://api.indeed.com/ads/apisearch?publisher=5566998848654317&v=2&q=%22%22&filter=1&limit=25&start={i}";

                XmlReaderSettings settings = new XmlReaderSettings();
                settings.ValidationType = ValidationType.None;
                settings.IgnoreWhitespace = true;
                XmlReader xmlReader = XmlReader.Create(newUrl, settings);

                while (!xmlReader.EOF)
                {
                    if (xmlReader.Name != "result")
                    {
                        xmlReader.ReadToFollowing("result");
                    }
                    if(!xmlReader.EOF)
                    {
                        ds.ReadXml(xmlReader);
                    }
                }
            }
       }
    }
}

【讨论】:

    【解决方案2】:

    您似乎假设在解析结果时结果不会改变,但情况可能并非如此。如果有新帖子出现,它可能会出现在列表的开头,并将您的其余结果向下推。这会导致页面上的最后一项在下一页上重复。

    此外,您提出的查询似乎没有确定的命令。在您搜索时,现有结果可能会更改顺序。同样,如果项目在搜索中移动,可能会导致重复或跳过项目。

    【讨论】:

      猜你喜欢
      • 2015-12-29
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多