如何将数据 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 中...但是您是什么意思? description
和 pubdate
是 NULL
还是只是 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 插入数据库的主要内容,如果未能解决你的问题,请参考以下文章