1

私は .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");

ただし、これらの例のいずれも、後で名前空間を利用する方法を示していません。たとえば、フィードを拡張する 2 つの方法を次に示します。

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 を拡張するときに使用される名前空間にリンクする特別な方法はありますか?

4

1 に答える 1

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);
}
于 2009-12-19T22:12:46.773 に答える