如何使用自定义命名空间创建 SyndicateFeed

发布于 2024-11-08 10:52:35 字数 390 浏览 0 评论 0原文

如何生成包含下图中显示的命名空间的 Atom Feed? Atom feed 的所有节点都必须以“a:”开头。

在此处输入图像描述

这是我现在正在做的事情,但它不起作用。

    SyndicationFeed feed = new SyndicationFeed();
    XmlQualifiedName key = new XmlQualifiedName("os", "xmlns");
    feed.AttributeExtensions.Add(key, "http://a9.com/-/spec/opensearch/1.1/");

谢谢!

How can I generate Atom Feed which will contain the namespaces displayed in the image below? All the nodes of the Atom feed have to start with "a:".

enter image description here

Here is what I am doing right now, however it doesn't work.

    SyndicationFeed feed = new SyndicationFeed();
    XmlQualifiedName key = new XmlQualifiedName("os", "xmlns");
    feed.AttributeExtensions.Add(key, "http://a9.com/-/spec/opensearch/1.1/");

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

颜漓半夏 2024-11-15 10:52:35

我相信应该是

SyndicationFeed feed = new SyndicationFeed();
XmlQualifiedName key = new XmlQualifiedName("os", "http://www.w3.org/2000/xmlns/");
feed.AttributeExtensions.Add(key, "http://a9.com/-/spec/opensearch/1.1/");

更新:

在更仔细地阅读您的问题后,我相信您可以通过覆盖 WriteStartElementWriteStartAttribute XmlWriter 的方法Atom10FeedFormatter 使用的 实例。您可以通过实现自定义 XmlWriter 类来完成此操作,如下例所示。

class AtomXmlTextWriter : XmlTextWriter
{
    private const string Atom10XmlNs = "http://www.w3.org/2005/Atom";
    private const string Atom10XmlNsPrefix = "a";

    public AtomXmlTextWriter(String filename, Encoding encoding)
        : base(filename, encoding)
    {
    }

    public override void WriteStartElement(string prefix, string localName, string ns)
    {
        base.WriteStartElement(GetAtomPrefix(ns), localName, ns);
    }

    public override void WriteStartAttribute(string prefix, string localName, string ns)
    {
        base.WriteStartAttribute(GetAtomPrefix(ns), localName, ns);
    }

    internal string GetAtomPrefix(string ns)
    {
        string prefix = string.Empty;

        if ((ns != null) && (ns.Equals(Atom10XmlNs)))
            prefix = Atom10XmlNsPrefix;

        return prefix;
    }
}

将自定义类与 Atom10FeedFormatter 结合使用

SyndicationFeed feed = new SyndicationFeed();
feed.AttributeExtensions.Add(new XmlQualifiedName("os", "http://www.w3.org/2000/xmlns/"), 
                             "http://a9.com/-/spec/opensearch/1.1/");

feed.AttributeExtensions.Add(new XmlQualifiedName(null, "http://www.w3.org/2000/xmlns/"),
                             http://schemas.zune.net/catalog/apps/2008/02");

using (XmlWriter writer = new AtomXmlTextWriter(@"TestFeed.xml", Encoding.UTF8))
{
    Atom10FeedFormatter feedFormatter = new Atom10FeedFormatter(feed);
    feedFormatter.WriteTo(writer);
}

会生成期望的输出

<a:feed xmlns:os="http://a9.com/-/spec/opensearch/1.1/" 
        xmlns="http://schemas.zune.net/catalog/apps/2008/02" 
        xmlns:a="http://www.w3.org/2005/Atom">
    <a:title type="text" />
    <a:id>uuid:0f1b2c84-c935-459e-bc89-79d06b5a976b;id=1</a:id>
    <a:updated>2011-05-21T17:07:46Z</a:updated>
</a:feed>

I believe it should be

SyndicationFeed feed = new SyndicationFeed();
XmlQualifiedName key = new XmlQualifiedName("os", "http://www.w3.org/2000/xmlns/");
feed.AttributeExtensions.Add(key, "http://a9.com/-/spec/opensearch/1.1/");

UPDATE:

After reading your question more carefully, I believe you could accomplish this by overriding the WriteStartElement and WriteStartAttribute methods of the XmlWriter instance used by the Atom10FeedFormatter. You can do this by implementing a custom XmlWriter class like the example below.

class AtomXmlTextWriter : XmlTextWriter
{
    private const string Atom10XmlNs = "http://www.w3.org/2005/Atom";
    private const string Atom10XmlNsPrefix = "a";

    public AtomXmlTextWriter(String filename, Encoding encoding)
        : base(filename, encoding)
    {
    }

    public override void WriteStartElement(string prefix, string localName, string ns)
    {
        base.WriteStartElement(GetAtomPrefix(ns), localName, ns);
    }

    public override void WriteStartAttribute(string prefix, string localName, string ns)
    {
        base.WriteStartAttribute(GetAtomPrefix(ns), localName, ns);
    }

    internal string GetAtomPrefix(string ns)
    {
        string prefix = string.Empty;

        if ((ns != null) && (ns.Equals(Atom10XmlNs)))
            prefix = Atom10XmlNsPrefix;

        return prefix;
    }
}

Using your custom class with the Atom10FeedFormatter

SyndicationFeed feed = new SyndicationFeed();
feed.AttributeExtensions.Add(new XmlQualifiedName("os", "http://www.w3.org/2000/xmlns/"), 
                             "http://a9.com/-/spec/opensearch/1.1/");

feed.AttributeExtensions.Add(new XmlQualifiedName(null, "http://www.w3.org/2000/xmlns/"),
                             http://schemas.zune.net/catalog/apps/2008/02");

using (XmlWriter writer = new AtomXmlTextWriter(@"TestFeed.xml", Encoding.UTF8))
{
    Atom10FeedFormatter feedFormatter = new Atom10FeedFormatter(feed);
    feedFormatter.WriteTo(writer);
}

produces the desired output

<a:feed xmlns:os="http://a9.com/-/spec/opensearch/1.1/" 
        xmlns="http://schemas.zune.net/catalog/apps/2008/02" 
        xmlns:a="http://www.w3.org/2005/Atom">
    <a:title type="text" />
    <a:id>uuid:0f1b2c84-c935-459e-bc89-79d06b5a976b;id=1</a:id>
    <a:updated>2011-05-21T17:07:46Z</a:updated>
</a:feed>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文