2009-11-24 64 views
1

我使用.NET SyndicationFeed類,並使用SyndicationItem.ElementExtensions.Add()添加了一些我自己的擴展,並將SyndicationItem.Content設置爲某些Xml內容。如何正確使用xmlns命名空間和.NET SyndicationFeeds的自定義擴展?

我的問題是我的命名空間在XML輸出中出現多次。理想情況下,我會將xmlns屬性應用於根節點,並在整個文檔中使用其別名。

我見過使用SyndicationFeed.AttributeExtensions的示例,如here。例如:

feed.AttributeExtensions.Add(
    new System.Xml.XmlQualifiedName("myns", "http://www.w3.org/2000/xmlns"), 
    "http://myNamespace.com"); 

但是,這些例子都沒有顯示如何在以後使用命名空間。例如,以下兩種方法可以擴展Feed:

XNamespace myNs = "http://myNamespace.com"; 
SyndicationItem item = new SyndicationItem(); 

XElement myMetadata = new XElement(myNs + "metadata"); 
myMetadata.Add(new XElement(myNs + "meta1", "value1")); 
myMetadata.Add(new XElement(myNs + "meta2", "value2")); 
item.Content = SyndicationContent.CreateXmlContent(myMetadata); 

XElement myExtensions = new XElement(myNs + "myExtensions"); 
myExtensions.Add(new XElement(myNs + "ext1", "value1")); 
myExtensions.Add(new XElement(myNs + "ext2", "value2")); 
item.ElementExtensions.Add(myExtensions); 

希望我錯過了簡單的事情。隨着進一步的上述AttribuetExtensions.Add()方法,我的進料具有用於初始XML以下:

<?xml version="1.0" encoding="utf-8"?> 
<rss xmlns:a10="http://www.w3.org/2005/Atom" version="2.0"> 
    <channel p3:myns="http://myNamespace.com" xmlns:p3="http://www.w3.org/2000/xmlns"> 

當然,我寧願對於myns名字的XMLNS是根RSS節點,而不是信道上,但我可以接受它在頻道上的生活。不幸的是,聯合項目XML是什麼樣子:

<item> 
    ...  
    <a10:content type="text/xml"> 
     <metadata xmlns="http://myNamespace.com"> 
      <meta1>value1</meta2> 
      <meta2>value2</meta2> 
     </metadata> 
    </a10:content> 
    <myExtensions xmlns="http://myNamespace.com"> 
     <ext1>value1</ext1> 
     <ext2>value2</ext2> 
    </myExtensions> 
</item> 

當然,我更願意看到的是:

<item> 
    ...  
    <a10:content type="text/xml"> 
     <myns:metadata> 
      <meta1>value1</meta2> 
      <meta2>value2</meta2> 
     </myns:metadata> 
    </a10:content> 
    <myns:myExtensions> 
     <ext1>value1</ext1> 
     <ext2>value2</ext2> 
    </myns:myExtensions> 
</item> 

有聯用SyndicationFeed.AttributeExtensions定義的命名空間的一些特殊的方法擴展SyndicationItem時使用了什麼?

回答

1

您可能要decalre命名空間爲飼料,像這樣:

new XmlQualifiedName("rdf", "http://www.w3.org/2000/xmlns/"), "http://www.w3.org/1999/02/22-rdf-syntax-ns#"); 

然後你就可以宣佈你的XNamespace和你的元素創作使用它。

XNamespace Rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; 
item.ElementExtensions.Add(
    new XElement(Rdf + "type", 
    new XAttribute(Rdf + "resource", "attribute value"))); 

我在這裏創建了一個rdf元素,但您可以爲您的任何自定義類型執行此操作。您甚至可以將創建名稱空間添加到SyndicationFeed和SyndicationItem的擴展方法中:

public static void SetNamespace(this SyndicationFeed feed, string prefix, string nsUri) 
{ 
    feed.AttributeExtensions.Add(new XmlQualifiedName(prefix, "http://www.w3.org/2000/xmlns/"), nsUri); 
} 

public static void SetNamespace(this SyndicationItem item, string prefix, string nsUri) 
{ 
    item.AttributeExtensions.Add(new XmlQualifiedName(prefix, "http://www.w3.org/2000/xmlns/"), nsUri); 
}