Search code examples
c#asp.netrsssyndication

ASP.NET C# Write RSS feed for Froogle


I'm trying to create a RSS 2.0 feed in ASP.NET C# with products to provide to Froogle.

The RSS feed should look like:

http://www.google.com/support/merchants/bin/answer.py?answer=160589&hl=en

I'm using the SyndicationFeed and SyndicationsItems to create the feed. But I'm having trouble adding the extra elements like g:image_link.

I try the extra elements like;

syndicationItem.ElementExtensions.Add(new XElement("image_link", product.ImageLink).CreateReader());

This works, but how can I add the namespace

xmlns:g="http://base.google.com/ns/1.0"

to the first RSS tag and use this for the extension elements?

Thank you


Solution

  • I just wrote something like this last week, as a matter of fact. I didn't have much time, so it's not optimized or pretty.

    I used an XDocument, though.

    static XDocument GetXDocument(List<GoogleProduct> googleProducts)
    {
        XNamespace gns = "http://base.google.com/ns/1.0";
    
        XDocument document = new XDocument(
            new XElement("rss",
                new XAttribute("version", "2.0"),
                new XAttribute(XNamespace.Xmlns + "g", gns),
                new XElement("channel",
                    new XElement("title", "X Company Feed"),
                    new XElement("description", "X Description"),
                    new XElement("link", "http://www.somecompany.com/"),
                    from googleProduct in googleProducts
                    select new XElement("item",
                        new XElement("title", googleProduct.Title),
                        new XElement(gns + "brand", googleProduct.ProductRecommendedAttributes.Brand),
                        new XElement(gns + "manufacturer", googleProduct.ProductRecommendedAttributes.Manufacturer),
                        new XElement(gns + "condition", googleProduct.Condition),
                        new XElement("description", googleProduct.Description),
                        new XElement(gns + "id", googleProduct.ID),
                        from img in googleProduct.ProductRecommendedAttributes.ImageLinks
                        select new XElement(gns + "image_link", img),
                        new XElement("link", googleProduct.Link),
                        new XElement(gns + "price", googleProduct.Price.ToString("0.00")),
                        new XElement(gns + "product_type", googleProduct.ProductRecommendedAttributes.ProductType),
                        from pmt in googleProduct.ProductOptionalAttributes.PaymentAccepteds
                        select new XElement(gns + "payment_accepted", pmt)))));
    
        //
        return document;
    }
    

    (FYI: GoogleProduct is just a temporary mapper class I used)

    It will generate a document along these lines

    <?xml version="1.0" encoding="utf-8"?>
    <rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
      <channel>
        <title>Blah Data Feed</title>
        <description>Stuff from Blah</description>
        <link>http://www.blah.com/shopping</link>
        <item>
          <title>Blah</title>
          <g:brand>Blah</g:brand>
          <g:manufacturer>Blah</g:manufacturer>
          <g:condition>New</g:condition>
          <description>blah blah</description>
          <g:id>268</g:id>
          <g:image_link>http://www.blah.com/shopping/images/PRODUCT/medium/268.jpg</g:image_link>
          <link>http://www.blah.com/</link>
          <g:price>1747.00</g:price>
          <g:product_type>Blah Blah</g:product_type>
          <g:payment_accepted>Cash</g:payment_accepted>
          <g:payment_accepted>Check</g:payment_accepted>
          <g:payment_accepted>Visa</g:payment_accepted>
          <g:payment_accepted>Mastercard</g:payment_accepted>
        </item>
        <item>
          <title>Blah</title>
          <g:brand>Blah</g:brand>
          <g:manufacturer>Blah</g:manufacturer>
          <g:condition>New</g:condition>
          <description>blah blah</description>
          <g:id>269</g:id>
          <g:image_link>http://www.blah.com/shopping/images/PRODUCT/medium/269.jpg</g:image_link>
          <link>http://www.blah.com/</link>
          <g:price>1103.00</g:price>
          <g:product_type>blah blah</g:product_type>
          <g:payment_accepted>Cash</g:payment_accepted>
          <g:payment_accepted>Check</g:payment_accepted>
          <g:payment_accepted>Visa</g:payment_accepted>
          <g:payment_accepted>Mastercard</g:payment_accepted>
        </item>
      </channel>
    </rss>