如何将数据 RSS 插入数据库

Posted

技术标签:

【中文标题】如何将数据 RSS 插入数据库【英文标题】:How to insert data RSS into database 【发布时间】:2014-04-04 11:28:01 【问题描述】:

我需要在 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 文件(查看源代码)。

我需要在数据库中插入值:

    标题:新闻、ASP.NET 和 Web 开发和焦点; 用于描述:新闻、ASP.NET 和 Web 开发和焦点; 发布日期:格林威治标准时间 2014 年 4 月 4 日星期五 13:57:16、格林威治标准时间 2014 年 2 月 26 日星期三 09:39:00 和格林威治标准时间 2014 年 2 月 26 日星期三 09:39:00

我的代码现在只插入数据库:

    标题:新闻; 用于描述:新闻;

    发布日期:格林威治标准时间 2014 年 4 月 4 日星期五 13:57:16。

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

【问题讨论】:

据我所知,XSLT 代表 XSL 转换。您可以使用它将一个 XML 文档转换为另一种文档类型(不仅仅是 XML)。根据定义,它本身没有任何数据。那你想在数据库中存储什么? 【参考方案1】:

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

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

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

【讨论】:

好的,但是现在在 db 中只插入 xslt 的标题 @Morix Dev,不,不!为什么?寻找 SQL 注入。 这就是你要它做的事情:插入标题。其他字段不会神奇地出现,您必须明确插入它们。 @Hamamelis:关于您的新版本(用于防止 SQL 注入),您说仍然只有 title 插入到 DB 中...但是您是什么意思? descriptionpubdateNULL 还是只是 DB 中的空字符串?此外:您能否提供一个您希望通过 XSLT 处理的数据样本? @Morix Dev:我需要在我的数据库中导入此示例页面 RSS http://www.SiteExample.com/News.rss 的所有新闻。在我的 C# 页面中,我在浏览器中显示 RSS 新闻,并且使用此代码,DB 中的插入仅用于新闻的一般标题,而不用于单个新闻的单个标题、描述和发布日期。【参考方案2】:

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

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

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

如果是这样,那么我认为问题不在于处理将数据插入到 DB 表中的代码部分,而在于对 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 注入安全代码将它们放入数据库表中,而不是将所有这些数据转储到控制台。

【讨论】:

以上是关于如何将数据 RSS 插入数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何将xml数据插入数据库

如何从wavemaker将数据插入数据库

如何将大量数据插入数据库[重复]

如何使用插入记录将所有值 frow 行插入 mysql 数据库?

如何将图像添加为RSS源的一部分

如何将null插入数据库?