Как правильно использовать пространства имен 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, а не на канале, но я могу жить с этим, находясь на канале. К сожалению, элемент синдикации выглядит так:
<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 ответ
Вы можете захотеть удалить пространство имен для канала следующим образом:
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);
}