从RSS feed中提取图片网址

墨GFX

知名会员
已加入
2013年2月2日
留言内容
142
编程经验
Beginner
我正在尝试从rss提要中提取图片网址...但是图片网址包装在<enclosure url>标签.......所以我的问题是..我如何从附件标签中提取值?

这是提要数据.....

<rss version="2.0">
<channel>
<title>比佛利山庄汽车俱乐部RSS 2.0 Feed</title>
<link>http://www.beverlyhillscarclub.com/</link>
<description>比佛利山庄汽车俱乐部RSS 2.0 Feed</description>
<language>en-us</language>
<item>
<title>1969年,阿尔法·罗密欧·杜特托</title>
<description>
<=!=[=C=D=A=T=A=[
1969年,阿尔法·罗密欧·杜特托<br />股票#03077,里程:0,VIN#<br /> Price: $17,500<br />外观颜色:银色,内部颜色:<br /> <div style="text-align: center;"><span style="颜色:rgb(255,0,0);"><span style="font-size: xx-large;"><em><strong> <span style="font-family: A
] =] =>


<=!=[=C=D=A=T=A=[
里亚尔(Helvetica),无衬线;">1969年,阿尔法·罗密欧·杜特(Alfa Romeo Duetto)2顶</span></strong></em></span></span></div><br style="font-family: A里亚尔(Helvetica),无衬线;" /><span style="font-size: large;"><span style="font-family: A里亚尔(Helvetica),无衬线;">1969年,Alfa Romeo Duetto,2个上装,银色与红色内饰,漂亮的色彩组合,带顶灯,非常干净细腻的发动机舱,坚固的底盘系统,在周末愉快地发出机械声音。为$ 17,500</span><br style="font-family: A里亚尔(Helvetica),无衬线;" /><br style="font-family: A里亚尔(Helvetica),无衬线;" /><span style="font-family: A里亚尔(Helvetica),无衬线;">如果您还有其他问题<strong><span style="颜色:rgb(0,255,0);">请致电310-975-0272</span></strong>或有任何疑问的电子邮件!我们也欢迎所有国际买家。我们可以为您提供运输报价和安排。</span></span>
] =] =>



</description>


<link>
1969年,阿尔法·罗密欧·杜特托
</link>


<enclosure url="http://www.beverlyhillscarclub.com/galleria_images/2078/2078_main_t.jpg" length="2791" type="image/jpeg"/> <----------------- this is what I need ------------------>
<guid>
1969年,阿尔法·罗密欧·杜特托
</guid>


<pubDate>2013年10月16日,星期三CDT</pubDate>

</item>

我尝试了这段代码

foreach (XmlNode node in nodes)
                    {
                        if (node != null)
                        {
                           
                            
                            dm.ItemTitle = node["title"].InnerText;
                            dm.Links = node["link"].InnerText;
                            dm.Description = node["description"].InnerText;
                            dm.ImageUrl = node.Attributes["enclosure url"].Value;
                           
                            string description = dm.Description;
                            string[] seperator = { " ", "src=" };
                            string Value = description;
                            string[] imagelink = Value.Split(seperator, StringSplitOptions.None);
                           
                            string imagelink_final = imagelink[2].Replace('"', ' ').Trim();
                            ImageLink.Add(imagelink[2].Replace('"', ' ').Trim());


                          
                            ListViewItem lvi = new ListViewItem(dm.ItemTitle);
                            lvi.SubItems.Add(dm.Description);
                            lvi.SubItems.Add(dm.Links);
                            lvi.SubItems.Add(" ");
                            lvi.SubItems.Add(dm.ImageUrl);
                            listView1.Items.Add(lvi);
                           


但是ImageUrl的值始终为null .....

谢谢您的帮助
-InkedGFX





 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
大概是这样的:
dm.ImageUrl = node.Attributes["enclosure url"].Value;
应该是这样的:
dm.ImageUrl = node["enclosure"].Attributes["url"].Value;
 

墨GFX

知名会员
已加入
2013年2月2日
留言内容
142
编程经验
Beginner
Presumably this:
dm.ImageUrl = node.Attributes["enclosure url"].Value;
应该是这样的:
dm.ImageUrl = node["enclosure"].Attributes["url"].Value;


是的,,,,这今天早上工作了...但是今晚不工作...为什么会工作,然后不呢?

InkedGFX
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
当它不起作用时实际上发生了什么?如果检查发生了什么,则可以确定原因,但是要确定没有症状的原因是相当困难的。
 

墨GFX

知名会员
已加入
2013年2月2日
留言内容
142
编程经验
Beginner
当我运行程序时..我得到一个"对象未设置为对象的实例"NullRefrenceError-...在尝试提取任何信息之前,我尝试检查节点是否为null .....但是每次都会收到错误....这是BackgroundWorker_DoWork()方法的所有代码

 foreach (string link in links)            {


                // string url = lstLinks.SelectedIndex.ToString();
                string url = link;
                XmlDocument xmlDoc = new XmlDocument();
                // xmlDoc.Load(links[lstLinks.SelectedIndex]);
                xmlDoc.Load(link);
                XmlElement root = xmlDoc.DocumentElement;
                XmlNodeList nodes = root.SelectNodes("channel/item");


                // List<DownloadManager> listDM = new List<DownloadManager>();
                // int counter = 0;
                // int progress;
                foreach (XmlNode node in nodes)
                {


                    if (node["enclosure"].Attributes["url"].Value != null) <----------------- this is the eror
                    {
                        string ItemTitle = node["title"].InnerText;
                        string Links = node["link"].InnerText;
                        string Description = node["description"].InnerText;
                        string PubDate = node["pubDate"].InnerText;
                        string ImageUrl = node["enclosure"].Attributes["url"].Value;




                        try
                        {


                            // listView1.BeginUpdate();
                            ListViewItem lvi = new ListViewItem(ItemTitle);
                            lvi.SubItems.Add(Description);
                            lvi.SubItems.Add(" ");
                            lvi.SubItems.Add(Links);
                            lvi.SubItems.Add(" ");
                            lvi.SubItems.Add(ImageUrl);
                            listView1.Items.Add(lvi);
                            // listView1.EndUpdate();
                            rssData.Add(ItemTitle + "*" + ImageUrl + "*" + Description + "*" + Links + "*" + ImageUrl);


                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message);
                        }


                    }
                    else
                    {




                        string ItemTitle = node["title"].InnerText;
                        string Links = node["link"].InnerText;
                        string Description = node["description"].InnerText;
                        // PubDate & ImageUrl are null - can't add the info
                        // string PubDate = node["pubDate"].InnerText;
                        // string ImageUrl = node["enclosure"].Attributes["url"].Value;


                        string description = dm.Description;
                        string[] seperator = { " ", "src=" };
                        string Value = description;
                        string[] imagelink = Value.Split(seperator, StringSplitOptions.None);
                        MessageBox.Show(imagelink[2].Replace('"', ' ').Trim());
                        string imagelink_final = imagelink[2].Replace('"', ' ').Trim();
                        ImageLink.Add(imagelink[2].Replace('"', ' ').Trim());


                        try
                        {
                            ListViewItem lvi = new ListViewItem(ItemTitle);
                            lvi.SubItems.Add(Description);
                            lvi.SubItems.Add(" ");
                            lvi.SubItems.Add(Links);
                            lvi.SubItems.Add(" ");
                            lvi.SubItems.Add(imagelink_final);
                            listView1.Items.Add(lvi);


                            rssData.Add(ItemTitle + "*" + Description + "*" + Links + "*" + imagelink_final);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message);
                        }
                  }
                }
              }
            }


感谢您的耐心配合和帮助

-InkedGFX
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
好吧,您知道您收到了NullReferenceException,并且知道在其抛出的那一行,因此该行上的哪个引用为null?显然,没有节点具有该名称,或者该节点没有属性具有该名称。
 

墨GFX

知名会员
已加入
2013年2月2日
留言内容
142
编程经验
Beginner
我知道有些rss资讯提供"pubDate"和/或图片链接"enclosure"标签.......问题是我无法检查pubDate或Enclosure标签是否为空.....这是代码

if (pubDate != null && node["enclosure"].Attributes["url"].Value != null)


仍然抛出一个nullrefrenceexception ......

-InkedGFX
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
如果没有“附件”元素,那么“节点["enclosure"]'为空,因此您无法访问其Attributes属性。如果有一个'enclosure'元素,但没有'url'属性,则为'node ["enclosure"].Attributes["url"]'为空,因此您无法访问其Value属性。您必须确保点之前的所有内容都不为null,否则使用点访问成员将抛出NullReferenceException。这就是Nul​​lReferenceException的含义:访问不存在的实例的实例成员。您需要检查每个单独的引用,以确保它在使用之前不为空,例如
string enclosureUrl = null;

if (node["enclosure"] != null && node["enclosure"].Attributes["url"] != null)
{
    enclosureUrl = node["enclosure"].Attributes["url"].Value;
}
 

墨GFX

知名会员
已加入
2013年2月2日
留言内容
142
编程经验
Beginner
是的...谢谢...我一直在试图找出如何做到这一点.......工作完美......
您愿意帮我让datagridview正常工作吗?


-InkedGFX
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
您愿意帮我让datagridview正常工作吗?
填充列表后,将其分配给DataGridView的DataSource。就是这样,仅此而已。如果您有特定问题,请具体描述。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
您认为使用数据网格或列表视图更好吗?
DataGridView是网格控件,而ListView不是。 ListView的重点是多个视图。如果仅使用“详细信息”视图,则不要使用ListView,除非您特别需要它提供的分组功能。由于多种原因,对于纯表格数据,DataGridView更好。
 

墨GFX

知名会员
已加入
2013年2月2日
留言内容
142
编程经验
Beginner
这是我刚遇到的另一个问题.....如果rss feed中有一些节点没有<enclosure url>标签根本没有...我收到的是零值错误..所以我滚动浏览了给出错误的rss feed,发现在RSS提要中,rss feed并不总是具有附件标签....会引发错误...如何检查以确保甚至有附件标签?

谢谢您的帮助

-InkedGFX
 

墨GFX

知名会员
已加入
2013年2月2日
留言内容
142
编程经验
Beginner
好的.....稍微思考一下我需要做什么,然后我想出了.....这是我想出的代码....非常简单...程序现在可以正常运行了。 .....

string PubDate = null; 
                   string ImageUrl = null;


                    if (node["enclosure"] != null && node["enclosure"].Attributes["url"].Value != null
                        || node["pubDate"] != null && node["pubDate"].InnerText != null)
                    {
                        string ItemTitle = node["title"].InnerText;
                        string Links = node["link"].InnerText;
                        string Description = node["description"].InnerText;
                        PubDate = node["pubDate"].InnerText;


                        if (node.SelectSingleNode("enclosure") != null)
                        {
                            
                            ImageUrl = node["enclosure"].Attributes["url"].Value;
                        }
                        else
                        {
                            ImageUrl = "No Data";
                        }




-InkedGFX
 
最佳 底部