2017-01-26 36 views
3

问题:删除使用的DataContractSerializer都没有命名空间的属性或XmlSerializer的

我创建了一个的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,它与命名空间其他XLS解析器没有问题,支持XLST。

我已经找到,但不是以后statet原因重复:

我已经读到它herehere,并在网络上的其他位置。

我只找到这两个务必:

  • 使用[DataContract(Namespace = "")] -Attribute
  • 使用XmlSerializer的
    • 通过延长XmlMediaTypeFormatter
    • 通过设置config.Formatters.XmlFormatter.UseXmlSerializer = true

DataContract:

DataContract属性不起作用好上课我管不着。我不想做这个丑陋的黑客:

[DataContract(Namespace = "")] 
IThisIsNonesense<T> : IEnumerable<T> 
{ 
} 

[DataContract(Namespace = "")] 
ThisIsNonesense<T> : List<T>, IThisIsNonesense<T> 
{ 
    public ThisIsNonesense() : base() {} 
} 

的XmlSerializer:

XmlSerializer的不是很灵活。例如它不支持Interface。我做例如大量使用IEnumerable<T>

我的问题:

怎么可能删除所有默认命名空间,而不需要通过整个代码库进行更改?如果不可能,你会建议什么?

+0

我通常只解析自己使用的XDocument的文件。 – jdweng

+0

虽然这会起作用,但这对我来说会是一个很大的开销。我不想放弃序列化的好处。另外,我的api方法应该可以通过JSON和将来显示的任何其他格式提供。 @jdweng –

回答

0

采取this answer看看代码,并使用System.Xml.Linq的,但可以调用一个简单的一行在控制台中显示:

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

但是,您在您的评论提到,你不想失去序列化的好处。如果这些好处之一是反序列化,那么我会反对这项建议 - 这将导致由DataContractSerializer的飞出SerializationException。

最后,看来你有兴趣让您的API方法能够支持多种介质类型。这是一个stated ability of ASP.NET Web API,因此,如果您已经使用.NET,这可能是一个不错的选择。

相关问题