2011-06-24 21 views
0

私は入力済みのRSSフィードを持っています。属性を削除して、再度、C#で要素を追加することなく、<itunes:subtitle>は名前空間として追加されると言うと要素が<subtitle>既存の名前空間プレフィックスを変更せずに既存のRSSに新しいRSS要素を追加

所望の出力です:

<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#で別の要素を追加するだけでなく、既存の名前空間:要素を維持しますか?

を参照してくださいコード:そうでない場合は、無効な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> 

同じくらい私が欠けている:)

答えて

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/があることがわかります。だからこそ、あなたは問題にぶつかるのです。

+0

私は既存のXMLの名前空間の使用に迷って、代わりに新しい名前空間を作成しようとしました。それが問題でした。 XNamespace itunes = XMLDoc.Root.GetNamespaceOfPrefix( "itunes"); –

関連する問題