Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 513
  • Last Modified:

How can I impliment substring() filter in asp.net XML RSS feed?

I'm having a trouble with substring() filter used in this vb XML RSS feed which I've set up, following a tutorial via this site:
http://www.vbasic.net/detail.aspx?tid=142

The line in the code below which is giving me trouble is, line 40:
objX.WriteElementString("description", dr("NewsStory").ToString.Substring(0, 100) & "..")

The error it produces is:
System.ArgumentOutOfRangeException: Index and length must refer to a location within the string.
Parameter name: length


When I change the description to show the whole News Story, like so:
objX.WriteElementString("description", dr("NewsStory"))

It works perfectly - however isn't the desired/required result.

If you could solve this I would be most grateful.

Cheers!
Imports System.Xml
Imports System.Text
Imports System.Data
Imports System.Data.SqlClient
 
Partial Class newsFeed
    Inherits System.Web.UI.Page
 
 
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
 
        Response.Clear()
        Response.ContentType = "application/rss+xml"
        Dim objX As New XmlTextWriter(Response.OutputStream, Encoding.UTF8)
        objX.WriteStartDocument()
        objX.WriteStartElement("rss")
        objX.WriteAttributeString("version", "2.0")
        objX.WriteStartElement("channel")
 
        Dim cmd As New SqlCommand("Select top 10 * From aspnet_News ORDER BY NewsId DESC", New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString))
        cmd.Connection.Open()
        Dim dr As SqlDataReader = cmd.ExecuteReader()
 
        objX.WriteElementString("title", "RSS News Feed")
        objX.WriteElementString("link", "http://www.site.com/news.aspx")
        objX.WriteElementString("description", "The latest news and information from the www.site.com")
        objX.WriteElementString("language", "en-us")
        objX.WriteElementString("ttl", "60")
        objX.WriteElementString("image", "http://www.site.com/Resources/images/logo.gif")
        objX.WriteElementString("lastBuildDate", String.Format("{0:R}", DateTime.Now))
 
        Do While dr.Read()
            objX.WriteStartElement("item")
            objX.WriteElementString("title", dr("NewsTitle").ToString())
            objX.WriteElementString("author", "Name of Author")
            objX.WriteElementString("link", "http://www.site.com/news.aspx?id=" & dr("NewsId"))
            objX.WriteStartElement("guid")
            objX.WriteAttributeString("isPermaLink", "true")
            objX.WriteString("http://www.site.com/news.aspx?id=" & dr("NewsId"))
            objX.WriteEndElement()
            objX.WriteElementString("pubDate", String.Format("{0:R}", dr("NewsDateTime")))
            objX.WriteStartElement("category")
            objX.WriteString(dr("NewsTitle").ToString())
            objX.WriteEndElement()
            'objX.WriteElementString("description", dr("NewsStory")) '//THIS WORKS!
            objX.WriteElementString("description", dr("NewsStory").ToString.Substring(0, 100) & "..") '//THIS DOESNT
            objX.WriteEndElement()
        Loop
 
        objX.WriteEndElement()
        objX.WriteEndElement()
        objX.WriteEndDocument()
        objX.Flush()
        objX.Close()
        Response.End()
 
    End Sub
 
End Class

Open in new window

0
badstyle
Asked:
badstyle
  • 4
  • 2
3 Solutions
 
ViceroyFizzlebottomCommented:
You need to ensure that the substring you're asking for isn't longer than the columns data. So you could use:
objX.WriteElementString("description", dr("NewsStory").ToString.Substring(0, dr("NewsStory").Length - 1) & "..")

Simply asking for string data from 0 - 100 will throw an exception if the data is < 100.
0
 
ViceroyFizzlebottomCommented:
Whoops, in my last line I meant "if the data > 100"
0
 
badstyleAuthor Commented:
hmm that's a little awkward, as there may be occasions when the data is less than the maximum required...

Is it possible to interrogate the data so that even if it is less than 100 it will still work?

Better than that... is it possible to interrogate the data so as not to clip words, or even round it to the nearest full stop? If so can you provide a solution on how that would work?

Thanks for your speedy assistance, really appreciate it!
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
ViceroyFizzlebottomCommented:
Below is a sample of something that would work. If the total length is > 100, we only work with the first 100 characters, taking from that the last space position (which we'll assume here is a word break).



string s = dr["NewsStory"].ToString();
string truncatedText = String.Empty;
 
if(s.Length > 100)
{
    truncatedText = s.Substring(0, 100).Substring(0, s.LastIndexOf(" "));
}
 
objx.WriteElementString("description", truncatedText + "...");

Open in new window

0
 
ViceroyFizzlebottomCommented:
Actually in the code above, you can't append the last .Substring() (My brain was in LINQ mode). So it would end up as:

truncatedText = s.Substring(0,100);
truncatedText = truncatedText.Substring(0, truncatedText.LastIndexOf(" "));

0
 
channa_mCommented:
How about something like this,

        Dim newsStory = dr("NewsStory").ToString
        Dim len = newsStory.Length - 1
 
        If len > 100 Then
            len = 100
        End If
 
        newsStory = newsStory.SubString(0, len)
        objX.WriteElementString("description", newsStory & "..")

Open in new window

0
 
badstyleAuthor Commented:
Although both gave desirable results I preferred Channa M's solution on the basis that it would show part of the parameters value even though its content may have contained less than the substrings maximum length.

Many thanks people!
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 4
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now