如何将数据RSS插入数据库

时间:2014-04-04 11:28:02

标签: c# .net xml xslt rss

我需要在DB中插入xslt文件的值,我尝试了这段代码。我在调试中没有错误但插入没有执行。

我非常感谢您在解决这个问题时可以给我的任何帮助,谢谢。

代码:

Stream stream = resp.GetResponseStream();

XmlTextReader reader = new XmlTextReader(stream);
reader.XmlResolver = null;

XmlDocument doc = new XmlDocument();
doc.Load(reader);

xmlRSS.Document = doc;

XmlNodeList dataNodes = doc.SelectNodes("/title");

OdbcCommand command;
OdbcDataAdapter adpter = new OdbcDataAdapter();

foreach (XmlNode node in dataNodes)
{
    string title = node.SelectSingleNode("title").InnerText;

    string sql = "insert into Product values(" + title.ToString() + ")";
    command = new OdbcCommand(sql, connection);
    adpter.InsertCommand = command;
    adpter.InsertCommand.ExecuteNonQuery();
}

XSLT文件:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" indent="yes"/>
  <xsl:param name="title"/>
  <xsl:template match="rss">
    <xsl:for-each select="channel/item">
      <br>
        <strong>
          <a href="{link}" target="_main">
            <xsl:value-of select="title"/>
          </a>
        </strong>
        <br></br>
        <xsl:value-of select="description" disable-output-escaping="yes"/>
      </br>
      <br></br>
      <xsl:value-of select="pubDate"/>
      <br></br>
    </xsl:for-each>
  </xsl:template>
  <xsl:template match="description">
    <br>
      <xsl:value-of select="."/>
    </br>
  </xsl:template>
</xsl:stylesheet>

SQL注入的新版本,但在DB寄存器中只有XSLT文件的标题:

foreach (XmlNode node in dataNodes)
{
    string titlenew = node.SelectSingleNode("//title").InnerText;
    string descriptionnew = node.SelectSingleNode("//description").InnerText;
    string pubDatenew = node.SelectSingleNode("//pubDate").InnerText;
    string sql = "insert into Product (title, description, pubdate) values (?,?, STR_TO_DATE(?, '%a, %d %b %Y %H:%i:%s GMT'));";

    connection.Open();
    command = new OdbcCommand(sql, connection);
    command.Parameters.AddWithValue("param1", titlenew.ToString());
    command.Parameters.AddWithValue("param2", descriptionnew.ToString());
    command.Parameters.AddWithValue("param3", pubDatenew.ToString());
    adpter.InsertCommand = command;
    adpter.InsertCommand.ExecuteNonQuery();
    connection.Close();
}

这是浏览器上的RSS文件(查看源代码)。

我需要在DB中插入值:

  1. 标题:新闻,ASP.NET&amp; Web开发和聚焦;
  2. 描述:新闻,ASP.NET&amp; Web开发和聚焦;
  3. For Pubdate:Fri,04 Apr 2014 13:57:16 GMT,Wed,26 Feb 2014 09:39:00 GMT and Wed,26 Feb 2014 09:39:00 GMT
  4. 我的代码现在只插入数据库:

    1. 标题:新闻;
    2. 描述:新闻;
    3. For Pubdate:Fri,04 Apr 2014 13:57:16 GMT。

        

      <title>News</title>
      <link>http://....
      <description>News</description>
      <pubDate>Fri, 04 Apr 2014 13:57:16 GMT</pubDate>
      <dc:date>2014-04-04T13:57:16Z</dc:date>
      <image>
        <title>News</title>
        <url>http://....</url>
        <link>http://....
      </image>
      <item>
        <title>ASP.NET & Web Development</title>
        <link>http://.....
        <description>ASP.NET & Web Development .....</description>
        <category>
        </category>
        <pubDate>Wed, 26 Feb 2014 09:39:00 GMT</pubDate>
        <guid isPermaLink="false">http://.....</guid>
        <dc:title>ASP.NET & Web Development</dc:title>
        <dc:creator>
        </dc:creator>
        <dc:description>ASP.NET & Web Development</dc:description>
        <dc:date>2014-02-26T09:39:00Z</dc:date>
        <dc:type>eip_news</dc:type>
        <dc:source>ASP.NET & Web Development</dc:source>
        <dc:language>us_US</dc:language>
      </item>
      <item>
        <title>In Focus</title>
        <link>http://.....
        <description>In Focus ..... </description>
        <category>
        </category>
        <pubDate>Wed, 26 Feb 2014 09:39:00 GMT</pubDate>
        <guid isPermaLink="false">http://.....</guid>
        <dc:title>In Focus</dc:title>
        <dc:creator>
        </dc:creator>
        <dc:description>In Focus</dc:description>
        <dc:date>2014-02-26T09:39:00Z</dc:date>
        <dc:type>eip_news</dc:type>
        <dc:source>In Focus</dc:source>
        <dc:language>us_US</dc:language>
      </item>
      

2 个答案:

答案 0 :(得分:0)

我会尝试在您的查询中添加引号,即:

string sql = "insert into Product values('" + title.ToString() + "')";

否则我认为SQL解析器很难被标题字符串中包含的引号搞糊涂。

答案 1 :(得分:0)

感谢您提供的详细信息(XML示例等)。

将您提供的XSLT应用于您提供的XML数据,将获得一个简单的HTML页面,该页面仅包含RSS项目列表(链接标题,描述和发布日期)。

但是,如果我没有错(看你的例子)你需要一个不同的东西:你想在你的数据库中插入所有项目的标题,描述和发布日期,甚至是RSS feed(第一个标题,您在XML文件中遇到的描述和pubDate):我无法理解您为什么要这样做,但无论如何这是我对您的要求的理解。

如果是这样,那么我认为问题并不是专门处理数据插入数据库表的代码部分,而是选择在XML文件上运行的数据。

这是我的代码(你的XML片段是xml):

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);

foreach (XmlNode xmlTitle in xmlDoc.SelectNodes("//title"))
{
    XmlNode xmlDescription = xmlTitle.ParentNode.SelectSingleNode("description");
    XmlNode xmlPubDate = xmlTitle.ParentNode.SelectSingleNode("pubDate");

    if (xmlDescription != null && xmlPubDate != null)
    {
        // Instead of printing to console PUT HERE your code to insert data into database

        Console.WriteLine(xmlTitle.InnerText);
        Console.WriteLine(xmlDescription.InnerText);
        Console.WriteLine(xmlPubDate.InnerText);
        Console.WriteLine();
    }
}

产生的输出如下:

News
News
Fri, 04 Apr 2014 13:57:16 GMT

ASP.NET & Web Development
ASP.NET & Web Development .....
Wed, 26 Feb 2014 09:39:00 GMT

In Focus
In Focus .....
Wed, 26 Feb 2014 09:39:00 GMT

我认为您需要满足您的要求。

您只需使用自己的SQL注入安全代码将它们放入数据库表中,而不是将所有这些数据转储到控制台。