Как правильно использовать пространства имен xmlns с пользовательскими расширениями для .NET SyndicationFeeds?

Я использую класс .NET SyndicationFeed и добавил некоторые из своих собственных расширений, используя SyndicationItem.ElementExtensions.Add(), а также устанавливая SyndicationItem.Content для некоторого содержимого Xml.

Моя проблема в том, что мое пространство имен появляется несколько раз в выводе XML. В идеале я бы применил атрибут xmlns к корневому узлу и использовал его псевдоним во всем документе.

Я видел примеры, в которых обсуждается использование SyndicationFeed.AttributeExtensions, как показано здесь. Например:

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

Но ни один из этих примеров не показывает, как использовать пространство имен позже. Например, вот два способа расширения фида:

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

Конечно, я бы предпочел, чтобы xmlns для myns находился на корневом узле 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?


person Kirk Liemohn    schedule 24.11.2009    source источник


Ответы (1)


Вы можете декольировать пространство имен для фида следующим образом:

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);
}
person Cragly    schedule 19.12.2009