开发者

Adding new RSS elements to existing RSS, without modifying existing namespace prefixes

I have an input RSS Feed with some elements already added with namespace prefix (for itunes). Without removing attribute and adding in C# again, an element, say <itunes:subtitle> is added as namespace and the element is <subtitle>

Desired output:

 <rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd/" version="2.0">
      <channel>
        <title>channelTitle</title>
        <itunes:subtitle>subtitle_description</itunes:subtitle>
        <item>
          <title>item1</title>
          <itunes:subtitle>A short description</itunes:subtitle>
        </item>
      </channel>
    </rss>

Input XML:

 <rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd/" version="2.0">
      <channel>

        <item>
          <title>item1</title>
          <itunes:subtitle>A short description</itunes:subtitle>
        </item>
      </channel>
    </rss>

How can I add another element in C#, but also maintain the existing namespace:element ? I'm having to explicitly add the namespace again in the code (and namespace should also be present in input XML, otherwise it's processing invalid XML:开发者_StackOverflow社区

See code:

 XNamespace itunes = "http://www.itunes.com/dtds/podcast-1.0.dtd/";
     string rssFeed = "<rss xmlns:itunes=\"http://www.itunes.com/dtds/podcast-1.0.dtd\" version=\"2.0\"><channel><item><title>item1</title><itunes:subtitle>A short description</itunes:subtitle></item></channel></rss>";

     XDocument XMLDoc = XDocument.Parse(rssFeed);

     XMLDoc.Root.RemoveAttributes();     
     XMLDoc.Root.Add(new XAttribute(XNamespace.Xmlns + "itunes", itunes.NamespaceName));

    //Without adding the namespace attribute explicitly, the xmlns attribute is added instead to <subtitle> instead of <itunes:subtitle> : 
      XMLDoc.Element("rss").Element("channel").AddFirst(
                    new XElement("title", "channelTitle"),
                    new XElement(itunes + "subtitle", "subtitle_description")
                );

gets added correctly. However, is now changed in the input XML, output:

<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd/">
  <channel>
    <title>channelTitle</title>
    <itunes:subtitle>subtitle_description</itunes:subtitle>
    <item>
      <title>item1</title>
      <subtitle xmlns="http://www.itunes.com/dtds/podcast-1.0.dtd">A short description</subtitle>
    </item>
  </channel>
</rss>

Approach2:

  XNamespace itunes = "http://www.itunes.com/dtds/podcast-1.0.dtd/";
  string rssFeed = "<rss xmlns:itunes=\"http://www.itunes.com/dtds/podcast-1.0.dtd\" version=\"2.0\"><channel><item><title>item1</title><itunes:subtitle>A short description</itunes:subtitle></item></channel></rss>";

           XDocument XMLDoc = XDocument.Parse(rssFeed);

            XMLDoc.Element("rss").Element("channel").AddFirst(
                new XElement("title", "channelTitle"),
                new XElement(itunes + "subtitle", "subtitle_description")
            );

            Console.WriteLine(XMLDoc);

Output:

<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
  <channel>
    <title>channelTitle</title>
    <subtitle xmlns="http://www.itunes.com/dtds/podcast-1.0.dtd/">subtitle_description</subtitle>
    <item>
      <title>item1</title>
      <itunes:subtitle>A short description</itunes:subtitle>
    </item>
  </channel>
</rss>

As much as my question is really long, I'm hoping to get few lines of code as an answer, sure there must be something simple I'm missing :)


I can't reproduce the problem you say you face, the following straightforward sample

    string rssFeed = "<rss xmlns:itunes=\"http://www.itunes.com/dtds/podcast-1.0.dtd\" version=\"2.0\"><channel><item><title>item1</title><itunes:subtitle>A short description</itunes:subtitle></item></channel></rss>";

    XDocument XMLDoc = XDocument.Parse(rssFeed);

    XNamespace itunes = XMLDoc.Root.GetNamespaceOfPrefix("itunes");

    XMLDoc.Element("rss").Element("channel").AddFirst(
                  new XElement("title", "channelTitle"),
                  new XElement(itunes + "subtitle", "subtitle_description")
              );

    XMLDoc.Save(Console.Out);
    Console.WriteLine();

when run with .NET 3.5, outputs

<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
  <channel>
    <title>channelTitle</title>
    <itunes:subtitle>subtitle_description</itunes:subtitle>
    <item>
      <title>item1</title>
      <itunes:subtitle>A short description</itunes:subtitle>
    </item>
  </channel>
</rss>

Looking closer at your code, the only problem is see is that some samples use the URI http://www.itunes.com/dtds/podcast-1.0.dtd while some have http://www.itunes.com/dtds/podcast-1.0.dtd/ with a trailing slash "/". So that might be the reason why you run into problems.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜