c# - 使用不带属性的 DataContractSerializer 或 XmlSerializer 删除所有命名空间

标签 c# xml asp.net-web-api namespaces datacontractserializer

问题:

我已经创建了一个 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 不是很灵活。例如它不支持接口(interface)。例如,我大量使用 IEnumerable<T> .

我的问题:

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

最佳答案

看看this answer中的代码它确实使用了 System.Xml.Linq,但可以通过简单的一行调用来显示在控制台中:

Console.WriteLine(RemoveAllNamespaces(XElement.Parse(xml)).ToString());

但是,您在评论中提到您不想失去序列化的好处。如果这些好处之一是反序列化,那么我建议不要这样做 - 它会导致 DataContractSerializer 抛出 SerializationException。

最后,您似乎有兴趣让您的 API 方法能够支持多种媒体类型。这是 stated ability of ASP.NET Web API ,所以如果您已经在使用 .NET,这可能是一个不错的选择。

关于c# - 使用不带属性的 DataContractSerializer 或 XmlSerializer 删除所有命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41868072/

相关文章:

c# - 当只有一个具有给定名称的方法时,Visual Studio 指出存在不明确的调用

xml - 在marklogic中查找两个xml文件之间的增量差异

xml - R: xmlParse 错误 "adding"额外 "AND "到 URL 链接,解析失败

c# - 使用 HttpClient 的随机 401 未授权错误

c# - 我如何检查在 PropertyChanged 事件中更改了哪个属性

c# - 更高效的数据包序列化

c# - 使用 LINQ 查找重叠的时间段(事件)

php - magento配置系统文件困惑

asp.net - Web API 授权属性不适用于操作

c# - 当使用 2 层架构将 UseEmbeddedHttpServer 设置为 true 时,如何使我的 RavenDB 应用程序正确执行?