Добавление пространств имен в SyndicationFeed, а не в отдельные элементы? - PullRequest
7 голосов
/ 01 марта 2011

У меня есть такой класс:

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 Feed с пользовательскими расширениями:

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

В идеале мне бы хотелось, чтобы это также работало, когда у меня есть SyndicationItems с ElementExtensions, поскольку фид должен знать обо всех различных пространствах имен.

(Редактировать: это просто для того, чтобы уменьшить размер XML и сделать его более удобным для чтения людьми)

1 Ответ

10 голосов
/ 01 марта 2011

Нашел ответ в на этот вопрос и адаптировал его:

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

В основном: Зарегистрируйте атрибут xmlns:my в канале, он автоматически выберет пространство имен для элементов, даже если они добавлены в SyndicationItem внутри канала.

Неясный, но аккуратный!

...