2

正しい構造のrssドキュメントにノードを追加する方法を理解しました。次に、pubDateの順序で並べ替えてから、画面に出力する必要があります。オンラインで例を見ると、XDocumentとLinqのものがたくさん見つかりましたが、XmlDocumentでは何も見つかりませんでした。私が持っているコードを廃棄して、ここからのアドバイスでXDocumentでそれを行う方法を考え出すか、XMLDocumentを続行してソートする方法を見つけるかどうか、頭を悩ませます。

XMLDocumentを使用すると、コードが希望どおりに機能するようになります。フィードが画面に出力されるときに、フィードをpubDateの順序で並べ替える必要があります。なので、とりあえずこれにこだわると思います。この記事http://support.microsoft.com/kb/555060と誰かがStackOverflowに投稿したxsltを見つけましたが、コードから「XmlHelperFunctions」を呼び出す方法がわかりません。XSLTは私が持っている最も簡単なオプションですか、それとももっと簡単なものがありますか?

これは私のコードです:

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

私の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>
4

1 に答える 1

4

Linq to XMLを使用すると、これをかなり迅速かつ簡単に実行できます。

XElement.Parse(...)を使用してXMLを解析すると、OrderBy関数またはOrderByDescending関数を使用して、コンテンツを非常に簡単に変更できます。簡単な例を次に示します。

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());

XMLはあなたのものと同じになることはありませんが、うまくいけば、あなたが何ができるかについてのアイデアをあなたに与えるでしょう。XElementオブジェクトとXAttributeオブジェクトを新しいXMLのコンテンツとして指定するだけで、次のように出力されます。

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

これがお役に立てば幸いです。

于 2012-08-24T10:33:13.480 に答える