在不修改现有命名空间前缀的情况下,向现有RSS添加新的RSS元素

本文关键字:RSS 添加 元素 命名空间 前缀 情况下 修改 | 更新日期: 2023-09-27 18:00:13

我有一个输入RSS提要,其中一些元素已经添加了名称空间前缀(用于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>

尽管我的问题很长,但我希望能得到几行代码作为答案,当然我遗漏了一些简单的东西:)

在不修改现有命名空间前缀的情况下,向现有RSS添加新的RSS元素

我无法重现您所说的面临的问题,下面是简单的示例

    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/后面带有斜杠"/"。所以这可能就是你遇到问题的原因。