2011-03-01 43 views
7

Tôi có một lớp học như thế này:Thêm không gian tên cho một SyndicationFeed chứ không phải là yếu tố cá nhân?

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

Tôi đang sử dụng nó để tạo ra một nguồn cấp Atom với Extensions tùy chỉnh:

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

này hoạt động tốt, ngoại trừ các thức ăn bổ sung không gian tên của tôi vào phần tử:

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

Có cách nào để đăng ký không gian tên với nguồn cấp dữ liệu thay thế, để có được kết quả như thế này không?

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

Lý tưởng nhất, tôi muốn điều này cũng hoạt động khi tôi có SyndicationItems với ElementExtensions, vì nguồn cấp dữ liệu nên biết về tất cả các không gian tên khác nhau.

(Edit: Đây hoàn toàn là để giảm kích thước của XML và để làm cho nó dễ dàng hơn để đọc cho con người)

+0

Michael, bạn có biết rằng cả hai giống hệt nhau? –

+0

@John Về mặt ngữ nghĩa có, tôi chỉ đang cố gắng giảm kích thước của XML được tạo ra –

+0

Bạn có thể đặt tất cả các phần mở rộng của bạn trong một phần tử bao bọc, hoặc có thể định dạng nguồn cấp dữ liệu không cho phép điều đó? –

Trả lời

10

Tìm thấy câu trả lời trong this question và thích nghi nó:

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

Về cơ bản: Đăng ký a xmlns:my Thuộc tính với nguồn cấp dữ liệu, nó sẽ tự động nhận không gian tên trên các phần tử ngay cả khi chúng được thêm vào một SyndicationItem trong nguồn cấp dữ liệu.

Ít người biết đến nhưng gọn gàng!

Các vấn đề liên quan