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

但是,这些示例都没有显示以后如何使用命名空间。例如,这是我扩展提要的两种方式:

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

您可能希望像这样为提要 decalre 命名空间:

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