使用不带属性的 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&lt;T&gt;

我的问题:

如何在不更改整个代码库的情况下默认删除所有命名空间?如果不可能,您有什么建议?

【问题讨论】:

我通常只使用 XDocument 自己解析文件。 虽然这可行,但这对我来说会是很多开销。我不想失去序列化的好处。此外,我的 api 方法应该可以通过 JSON 和将来出现的任何其他格式使用。 @jdweng​​span> 【参考方案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 删除所有命名空间的主要内容,如果未能解决你的问题,请参考以下文章

JSONKit 不反序列化不带引号的属性

XmlReader:无法解析不带引号的属性

带/不带引号的 HTML 属性

元素scroll系列属性

元素scroll系列属性

如何在运行时创建不带数据属性的剔除数据绑定