2010-03-30 11 views
0

Je suis en train de créer un flux RSS 2.0 dans ASP.NET C# avec des produits à fournir à Froogle.ASP.NET C# Ecrire flux RSS pour Froogle

Le flux RSS devrait ressembler à:

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

J'utilise le SyndicationFeed et SyndicationsItems pour créer l'alimentation. Mais j'ai du mal à ajouter les éléments supplémentaires comme g: image_link.

J'essaie les éléments supplémentaires comme;

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

Cela fonctionne, mais comment puis-je ajouter l'espace de noms

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

à la première balise RSS et utiliser ceci pour les éléments d'extension?

Merci

Répondre

1

Je viens d'écrire quelque chose comme ça la semaine dernière, en effet. Je n'ai pas eu beaucoup de temps, donc ce n'est pas optimisé ou joli.

J'ai cependant utilisé un 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; 
} 

(Pour votre information: GoogleProduct est juste une classe temporaire mappeur je)

Il va générer un document le long de ces lignes

<?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> 
+0

Merci pour l'info. J'espérais que c'était possible en utilisant le SyndicationItem etc, mais je vais essayer votre approche. – Peter

+0

Par tous les moyens, explorez! Comme je l'ai dit, j'étais sous pression et je suis plus à l'aise avec Linq-to-XML, donc c'était un chemin naturel pour moi. –

+0

J'ai exploré toute la journée pour le trouver, mais il semble impossible d'ajouter un espace de noms à la balise RSS en utilisant le SyndicateFeed :( – Peter

1

XElements a un grand support d'espace de noms. Créez votre premier élément comme celui-ci:

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

Cela vous donnera XML comme ceci:

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

Chaque élément suivant doit également utiliser le même espace de noms. Si vous voulez utiliser des préfixes d'espace de noms pour vos éléments, c'est une approche similaire. Vous pouvez consulter des exemples complets sur MSDN ici:

How to: Create a Document with Namespaces

+0

Google a besoin (la plupart) les éléments pour avoir la g : préfixe, malheureusement. Il veut g: image_link, g: prix, etc –

+0

Ouais c'est bien. Jetez un oeil sur le lien, il montre comment vous pouvez ajouter un préfixe à un élément. Vous venez de le créer en tant que nouveau XElement (nom, préfixe, contenu), où préfixe est un XElementAttribute. – womp

+0

Oui, je l'ai implémenté en l'incluant dans un attribut de la ligne "rss". 'new XAttribute (XNamespace.Xmlns +" g ", xnamespace)'. Les XElements suivants ont juste besoin d'être nommés en tant qu'espace de noms + le nom réel de l'élément. (Voir ma réponse.) –