问题:
我已经创建了一个 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 解析器没有的命名空间方面存在问题。
我找到的,但由于后面的声明原因不是重复的:
我只找到了这两个建议:
- 使用
[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/