如何更改 api 输出的根元素
how to change root element of api output
我创建了一个 api 以 xml 的形式给出输出。它用于为网站提供站点地图。它只包含以下代码
public class SitemapApiController : ApiController
{
public urlset GetSitemap()
{
// code for data access etc
return urlsetObj;
}
}
url设置class很简单
[XmlRoot("urlset")]
public class urlset: List<url>
{
}
urlclass如下
public class url
{
public string loc { get; set; }
public DateTime lastmod { get; set; }
public double priority { get; set; }
}
现在我的问题是输出是
<arrayofurls>
<url>.....
虽然我希望它是
<urlset>
<url>....
我已经阅读了类似的 posts,但没有缓解。如 Modify the xml array element name in serialized ASP.NET WebAPI object post 所述,如果我使用
[XmlArray("urlset")]
atribute over api controller,然后给出错误,属性 "XmlArray" 在此声明类型中无效。请帮助我,以便我可以 return 来自 api 的有效站点地图。
编辑
按照这个输出还是有点区别的。现在显示
<urlset>
<url>
<url>
<loc>
<url>........
有一个额外的不必要的 url 属性作为所有 url 属性的父属性。
已更新
这需要一些工作,但我相信我找到了您要找的东西。
WebApi 项目应使用命名空间 System.Runtime.Serialization
而不是命名空间 System.Xml.Serialization
.
序列化 XML
使用这种新的序列化方式,输出想要的结果变得异常简单。
api控制器GET
方法:
public urlset Get()
{
return new urlset
{
new url { loc = "1" },
new url { loc = "2" },
new url { loc = "3" }
};
}
urlset
class:
[CollectionDataContract(Name ="urlset", Namespace ="")]
public class urlset:List<url>
{
}
url
class:
[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
属性。但是,似乎没有 "easy" 方法可以删除它。
以下是我用于得出此解决方案的资源:
Whosebug: How to serialize xml into desired format in asp.net web api
我创建了一个 api 以 xml 的形式给出输出。它用于为网站提供站点地图。它只包含以下代码
public class SitemapApiController : ApiController
{
public urlset GetSitemap()
{
// code for data access etc
return urlsetObj;
}
}
url设置class很简单
[XmlRoot("urlset")]
public class urlset: List<url>
{
}
urlclass如下
public class url
{
public string loc { get; set; }
public DateTime lastmod { get; set; }
public double priority { get; set; }
}
现在我的问题是输出是
<arrayofurls>
<url>.....
虽然我希望它是
<urlset>
<url>....
我已经阅读了类似的 posts,但没有缓解。如 Modify the xml array element name in serialized ASP.NET WebAPI object post 所述,如果我使用
[XmlArray("urlset")]
atribute over api controller,然后给出错误,属性 "XmlArray" 在此声明类型中无效。请帮助我,以便我可以 return 来自 api 的有效站点地图。
编辑
按照这个输出还是有点区别的。现在显示
<urlset>
<url>
<url>
<loc>
<url>........
有一个额外的不必要的 url 属性作为所有 url 属性的父属性。
已更新
这需要一些工作,但我相信我找到了您要找的东西。
WebApi 项目应使用命名空间 System.Runtime.Serialization
而不是命名空间 System.Xml.Serialization
.
使用这种新的序列化方式,输出想要的结果变得异常简单。
api控制器GET
方法:
public urlset Get()
{
return new urlset
{
new url { loc = "1" },
new url { loc = "2" },
new url { loc = "3" }
};
}
urlset
class:
[CollectionDataContract(Name ="urlset", Namespace ="")]
public class urlset:List<url>
{
}
url
class:
[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
属性。但是,似乎没有 "easy" 方法可以删除它。
以下是我用于得出此解决方案的资源:
Whosebug: How to serialize xml into desired format in asp.net web api