代码之家  ›  专栏  ›  技术社区  ›  Kirk Liemohn

如何正确地使用带有.NET联合源自定义扩展名的xmlns命名空间?

  •  1
  • Kirk Liemohn  · 技术社区  · 15 年前

    我正在使用.NETSyndicationFeed类,并使用添加了一些自己的扩展联合项目.ElementExtensions.Add()以及设置联合项目.内容对一些Xml内容。

    我的问题是,我的命名空间在XML输出中多次出现。理想情况下,我会将xmlns属性应用于根节点,并在整个文档中使用它的别名。

    我见过一些讨论使用联合订阅源.AttributeExtensions如所见 here

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

    希望我错过了一些简单的东西。与AttributeTextensions.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>
    

    是否有某种特殊的方法来链接由定义的命名空间联合订阅源.AttributeExtensions在扩展一个联合项目时使用这个?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Cragly    15 年前

    您可能希望为提要标记命名空间,如下所示:

    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);
    }
    
    推荐文章