ASP.NET C # Написать RSS-канал для Froogle - PullRequest
0 голосов
/ 31 марта 2010

Я пытаюсь создать ленту RSS 2.0 в ASP.NET C # с продуктами, предоставляемыми Froogle.

RSS лента должна выглядеть так:

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

Я использую SyndicationFeed и SyndicationsItems для создания канала. Но у меня возникают проблемы при добавлении дополнительных элементов, таких как g: image_link.

Я пробую дополнительные элементы, как;

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

Это работает, но как я могу добавить пространство имен

XMLNS: г = "http://base.google.com/ns/1.0"

к первому тегу RSS и использовать это для элементов расширения?

Спасибо

Ответы [ 2 ]

1 голос
/ 31 марта 2010

Я только что написал что-то вроде этого на прошлой неделе, на самом деле. У меня не было много времени, поэтому он не оптимизирован и не хорош.

Я использовал XDocument, хотя.

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

(К вашему сведению: GoogleProduct - это просто класс временного сопоставителя, который я использовал)

Будет сгенерирован документ по этим направлениям

<?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>
1 голос
/ 31 марта 2010

XElements имеют отличную поддержку пространства имен.Создайте свой первый элемент, подобный этому:

XNamespace aw = "http://base.google.com/ns/1.0";
XElement root = new XElement(aw + "image_link", product.ImageLink);

Это даст вам XML, подобный следующему:

<image_link xmlns="http://base.google.com/ns/1.0">
</image_link>

Каждый последующий элемент также должен использовать то же пространство имен.Если вы хотите использовать префиксы пространства имен для ваших элементов, это аналогичный подход.Вы можете проверить некоторые полные примеры по MSDN здесь:

Как: создать документ с пространствами имен

...