Добавление новых элементов RSS в существующие RSS без изменения существующих префиксов пространства имен - PullRequest
0 голосов
/ 24 июня 2011

У меня есть входная лента 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>

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

Вывод:

<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 голосов
/ 26 июня 2011

Я не могу воспроизвести проблему, с которой вы говорите, следующий простой пример

    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/ с косой чертой "/". Так что это может быть причиной возникновения проблем.

...