如何更改API输出的根元素

本文关键字:元素 输出 何更改 API | 更新日期: 2023-09-27 18:13:12

我创建了一个api,它以xml的形式给出输出。它用于为网站提供站点地图。它只包含以下代码

public class SitemapApiController : ApiController
{
    public urlset GetSitemap()
    {
        // code for data access etc
        return urlsetObj;
    }
}

urlset类非常简单

[XmlRoot("urlset")]
public class urlset: List<url>
{
}

url类如下

public class url
{
    public string loc { get; set; }
    public DateTime lastmod { get; set; }        
    public double priority { get; set; }
}

现在我的问题是输出是

<arrayofurls>
         <url>.....

而我希望它是

<urlset>
     <url>....

我读过类似的帖子,但没有缓解。如在序列化ASP中修改xml数组元素名中所述。. NET WebAPI对象post,如果我使用

[XmlArray("urlset")]

属性在api控制器上,然后它给出错误,属性"XmlArray"在此声明类型中无效。请帮助我,这样我就可以从api返回有效的站点地图。

编辑
根据这个输出仍然有点不同。现在显示

<urlset>
    <url>
        <url>
            <loc>
        <url>........ 

有一个多余的url属性作为所有url属性的父属性。

如何更改API输出的根元素

已更新

花了点功夫,但我相信我找到了你要找的东西。

WebApi项目应该使用命名空间System.Runtime.Serialization序列化XML,而不是使用命名空间System.Xml.Serialization

使用这个新的序列化方法,输出您想要的结果变得非常简单。

api控制器GET方法:

public urlset Get()
{
    return new urlset
    {
        new url { loc = "1" },
        new url { loc = "2" },
        new url { loc = "3" }
    };
}

urlset类:

[CollectionDataContract(Name ="urlset", Namespace ="")]
public class urlset:List<url>
{
}

url类:

[DataContract(Namespace = "")]
public class url
{
    [DataMember]
    public string loc { get; set; }
    [DataMember]
    public DateTime lastmod { get; set; }
    [DataMember]
    public double priority { get; set; }
}

输出:

<urlset xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <url>
        <lastmod>2016-10-19T08:07:28.6867397-07:00</lastmod>
        <loc>1</loc>
        <priority>0</priority>
    </url>
    <url>
        <lastmod>2016-10-15T08:07:28.6867397-07:00</lastmod>
        <loc>2</loc>
        <priority>0</priority>
    </url>
    <url>
        <lastmod>2016-09-20T08:07:28.6867397-07:00</lastmod>
        <loc>3</loc>
        <priority>0</priority>
    </url>
</urlset>

我意识到您在问题中给出的示例在根节点中没有xmlns属性。然而,似乎没有"简单"的方法来删除它。

这里是我用来得到这个解决方案的资源:

StackOverflow:如何在asp.net web api中将xml序列化成所需的格式

MSDN:数据契约中的集合类型