将新RSS元素添加到现有RSS,而无需修改现有名称空间前缀

时间:2011-06-24 19:42:26

标签: c# rss linq-to-xml asp.net-3.5 itunes

我有一个输入RSS Feed,其中一些元素已经添加了命名空间前缀(用于itunes)。在不删除属性并再次添加C#的情况下,添加一个元素,例如<itunes:subtitle>作为命名空间,元素为<subtitle>

期望的输出:

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

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

如何在C#中添加另一个元素,还要维护现有的命名空间:element?我不得不在代码中再次显式添加命名空间(并且命名空间也应该存在于输入XML中,否则它处理无效的XML:

参见代码:

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

正确添加。 但是,现在在输入XML中更改了输出:

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

方法2:

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

输出:

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

尽管我的问题很长,但我希望得到几行代码作为答案,确保必须有一些简单的东西我不知道:)

1 个答案:

答案 0 :(得分:0)

我无法重现你说的问题,以下简单的样本

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

使用.NET 3.5运行时,输出

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

仔细观察您的代码,唯一的问题是,有些示例使用URI http://www.itunes.com/dtds/podcast-1.0.dtd,而有些样本的http://www.itunes.com/dtds/podcast-1.0.dtd/带有斜杠“/”。这可能就是你遇到问题的原因。