2011-03-01 69 views
7

我有一類這樣的:將命名空間添加到SyndicationFeed而不是單個元素?

public static class MyFeedExtensions 
{ 
    private readonly static XNamespace _namespace = XNamespace.Get(@"http://mynamespace"); 

    public static XElement MyElement(string value) 
    { 
     return new XElement(_namespace + "MyElement", value); 
    } 
} 

我用它來生成一個Atom提要具有自定義擴展:

var feed = new SyndicationFeed(); 
feed.ElementExtensions.Add(MyFeedExtensions.MyElement("Testing!")); 

這工作得很好,但是所用原料加我的名字空間的元素:

<feed xmlns="http://www.w3.org/2005/Atom"> 
    <title type="text">Hello World!</title> 
    <id>00000000-0000-0000-0000-000000000000</id> 
    <updated>2011-03-01T01:00:53Z</updated> 
    <MyElement xmlns="http://mynamespace">Testing!</MyElement> 
</feed> 

有沒有辦法用feed來註冊一個名稱空間,而不是像這樣得到一個輸出?

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:my="http://mynamespace"> 
    <title type="text">Hello World!</title> 
    <id>00000000-0000-0000-0000-000000000000</id> 
    <updated>2011-03-01T01:00:53Z</updated> 
    <my:MyElement>Testing!</my:MyElement> 
</feed> 

理想情況下,我想這也是當我有ElementExtensions SyndicationItems工作,作爲飼料應瞭解所有不同的命名空間。

(編輯:這純粹是爲了減少XML的大小,並使其更容易爲人類閱讀)

+0

邁克爾,你知道這兩者是相同的嗎? –

+0

@John在語義上是的,我只是想減少生成的XML的大小 –

+0

你可以把所有的擴展放在一個包裝元素中,或者飼料格式不允許嗎? –

回答

10

找到了答案在this question和適應它:

feed.AttributeExtensions.Add(
    new XmlQualifiedName("my",XNamespace.Xmlns.ToString()), 
    MyFeedExtensions.Namespace.ToString()); 

基本上是:註冊一個xmlns:my屬性,即使它們被添加到Feed中的SyndicationItem,它也會在元素上自動拾取名稱空間。

模糊不清,但很整潔!

相關問題