使用不带属性的 DataContractSerializer 或 XmlSerializer 删除所有命名空间
Posted
技术标签:
【中文标题】使用不带属性的 DataContractSerializer 或 XmlSerializer 删除所有命名空间【英文标题】:Remove all Namespaces using DataContractSerializer without Attributes or XmlSerializer 【发布时间】:2017-06-11 14:32:55 【问题描述】:问题:
我已经创建了一个 WebApi,需要支持 XML。
默认的 DataContractSerializer 会生成如下命名空间:
xmlns:d2p1="http://schemas.datacontract.org/2004/07/Vendor.App.Model.DeeperModel"
xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
我不想在我的 XML 中包含这些名称空间。和他们一起工作很辛苦。
在我的情况下,我需要支持 FileMaker 的 XLST,而其他 XLS 解析器没有的命名空间存在问题。
我发现了什么,但由于后来声明的原因不是重复的:
我已经在here、here 和网络上的其他位置阅读过它。
我只找到了这两个建议:
使用[DataContract(Namespace = "")]
-属性
使用 XmlSerializer
通过扩展XmlMediaTypeFormatter
通过设置config.Formatters.XmlFormatter.UseXmlSerializer = true
数据合约:
DataContract 属性不适用于我无法控制的类。我不想做这个丑陋的黑客:
[DataContract(Namespace = "")]
IThisIsNonesense<T> : IEnumerable<T>
[DataContract(Namespace = "")]
ThisIsNonesense<T> : List<T>, IThisIsNonesense<T>
public ThisIsNonesense() : base()
XmlSerializer:
XmlSerializer 不是很灵活。例如它不支持接口。例如,我大量使用IEnumerable<T>
。
我的问题:
如何在不更改整个代码库的情况下默认删除所有命名空间?如果不可能,您有什么建议?
【问题讨论】:
我通常只使用 XDocument 自己解析文件。 虽然这可行,但这对我来说会是很多开销。我不想失去序列化的好处。此外,我的 api 方法应该可以通过 JSON 和将来出现的任何其他格式使用。 @jdwengspan> 【参考方案1】:查看this answer 中的代码,它确实使用了 System.Xml.Linq,但可以通过简单的一行调用以在控制台中显示:
Console.WriteLine(RemoveAllNamespaces(XElement.Parse(xml)).ToString());
但是,您在评论中提到您不想失去序列化的好处。如果其中一个好处是反序列化,那么我建议不要这样做 - 这将导致 DataContractSerializer 抛出 SerializationException。
最后,您似乎有兴趣让您的 API 方法能够支持多种媒体类型。这是stated ability of ASP.NET Web API,所以如果您已经在使用 .NET,这可能是一个不错的选择。
【讨论】:
以上是关于使用不带属性的 DataContractSerializer 或 XmlSerializer 删除所有命名空间的主要内容,如果未能解决你的问题,请参考以下文章