2012-08-24 5 views
1

J'ai trouvé comment ajouter des nœuds à mon document rss dans la bonne structyre. J'ai maintenant besoin de le trier dans l'ordre pubDate et ensuite sortir à l'écran. En regardant les exemples en ligne, j'ai trouvé beaucoup de choses XDocument et Linq mais rien avec XmlDocument. Se gratter la tête pour savoir si je dois supprimer le code que j'ai et comment travailler dans XDocument avec les conseils d'ici ou continuer avec XMLDocument et trouver un moyen de trier. Avec XMLDocument, j'ai le code qui fonctionne exactement comme je veux, j'ai juste besoin que mon flux soit trié dans l'ordre pubDate quand il le crache à l'écran. Donc je pense que je m'en tiendrai là pour le moment. J'ai trouvé cet article http://support.microsoft.com/kb/555060 et un xslt quelqu'un posté dans Stack Overflow, mais je ne sais pas comment appeler le "XmlHelperFunctions" de mon code. Est-ce que XSLT est l'option la plus facile que j'ai, ou est-ce qu'il y a quelque chose de plus facile là-bas?XMLdocument Tri

Ceci est mon code:

XmlDocument xmlDoc = new XmlDocument(); 

    xmlDoc.LoadXml(rssFeed.ToString()); 

    XmlNodeList nl = xmlDoc.SelectNodes("/rss/channel/item"); 

    foreach (XmlNode xn in nl) 
    { 
     string title = xn["title"].InnerText; 
     string link = xn["link"].InnerText; 
     string desc = xn["description"].InnerText; 
     string auth = xn["author"].InnerText; 
     string pdate = xn["pubDate"].InnerText; 

     XmlElement itemnode = xmlDoc.CreateElement("item"); 

     itemnode.InnerXml = "<title></title><link></link><description></description><author></author><pubDate></pubDate>"; 
     itemnode["title"].InnerText = title; 
     itemnode["link"].InnerText = link; 
     itemnode["description"].InnerText = desc; 
     itemnode["author"].InnerText = auth; 
     itemnode["pubDate"].InnerText = pdate; 

     xmlDoc.DocumentElement.SelectNodes("/rss/channel")[0].AppendChild(itemnode); 
    } 

    // Output to screen 
    xmlDoc.Save(Response.Output); 

mon flux rss

<?xml version="1.0" encoding="utf-8"?> 
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"> 
<channel> 
<title>My RSS Feed</title> 
<link>http://www.mylink.aspx</link> 
<description> 
</description> 
<item> 
    <title>Top marks</title> 
    <link>http://www.mymarks.aspx</link> 
    <description> 
    &lt;p&gt;description field here&lt;/p&gt; 
    </description> 
    <author>Viv</author> 
    <pubDate>Thu, 16 Aug 2012 12:10:54 GMT</pubDate> 
</item> 
<item> 
    <title>Costa Coffee</title> 
    <link>http://www.Costa.aspx</link> 
    <description> 
    &lt;p&gt;Costa Coffee have special offers.&lt;/p&gt; 
    </description> 
    <author>Mike</author> 
    <pubDate>Thu, 23 Aug 2012 15:55:53 GMT</pubDate> 
</item> 
<item> 
    <title>Celebrate success</title> 
    <link>http://www.Celebrate.aspx</link> 
    <description> 
    &lt;p&gt;Lets all celebrate &lt;/p&gt; 
    </description> 
    <author>Viv</author> 
    <pubDate>Thu, 22 Aug 2012 09:10:21 GMT</pubDate> 
</item> 
</channel> 
</rss> 
+0

jetez un oeil à cela http://stackoverflow.com/questions/344737/sorting-xml-nodes-based-on-datetime-attribute-c-xpath – saj

Répondre

3

Vous pouvez le faire en utilisant assez rapidement et sans douleur Linq to XML.

Si vous analysez votre XML en utilisant XElement.Parse (...) vous pouvez ensuite utiliser les fonctions OrderBy ou OrderByDescending et modifier le contenu assez facilement. Voici un exemple simplifié:

XElement element = XElement.Parse(@" 
<rss> 
<channel> 
<item title='something' pubDate='22/11/2012'/> 
<item title='something2' pubDate='24/03/2012'/> 
<item title='something3' pubDate='10/02/2010'/> 
<item title='something4' pubDate='22/01/2011'/> 
</channel> 
</rss>"); 

var elements = element.Element("channel") 
       .Elements("item") 
       .OrderBy<XElement, DateTime>(e => DateTime.ParseExact(e.Attribute("pubDate").Value, "dd/MM/yyyy", null)) 
       .Select(e => new XElement("item", 
        new XElement("title", e.Attribute("title").Value), 
        new XElement("pubDate", e.Attribute("pubDate").Value))); // Do transform here. 

      element.Element("channel").ReplaceAll(elements); 

      Console.Write(element.ToString()); 

Le XML ne va pas être le même que le vôtre, mais nous espérons qu'il vous donne une idée de ce que vous pourriez faire. Vous pouvez spécifier des objets simplement XElement et XAttribute que le contenu de votre nouveau XML, ce produit les éléments suivants:

<rss> 
    <channel> 
    <item> 
     <title>something3</title> 
     <pubDate>10/02/2010</pubDate> 
    </item> 
    <item> 
     <title>something4</title> 
     <pubDate>22/01/2011</pubDate> 
    </item> 
    <item> 
     <title>something2</title> 
     <pubDate>24/03/2012</pubDate> 
    </item> 
    <item> 
     <title>something</title> 
     <pubDate>22/11/2012</pubDate> 
    </item> 
    </channel> 
</rss> 

J'espère que cela est utile.

+0

Salut Balthy, merci. J'ai l'impression d'avoir une erreur dans intellisense en essayant d'utiliser le .OrderBy - ".... XElement ne contient pas de définition pour OrderBy". – JK36

+0

Je m'attends à ce que vous devez vous assurer que vous avez un "using System.Linq;" déclaration en haut de votre fichier de code. C'est l'espace de noms Linq principal qui contient la plupart des méthodes d'extension (y compris OrderBy) – Balthy

+0

Hmmm ... Je viens d'écrire cela dans une application de console par défaut. Avez-vous toutes les instructions d'utilisation suivantes? en utilisant le système; en utilisant System.Linq; en utilisant System.Xml.Linq; – Balthy