2017-01-26 16 views
3

Проблема:Удалить все Namespaces с помощью 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. С ним очень сложно работать с ними.

В моем случае мне нужно поддерживать XLST от FileMaker, у которого проблемы с пространствами имен, отсутствующие в других XLS-анализаторах.

То, что я нашел, но это не является дубликатом для более поздних причин statet:

Я прочитал об этом here, here и других местах в Интернете.

Я только нашел это два советы:

  • Используйте [DataContract(Namespace = "")]
  • атрибута по
  • Используйте 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 не очень гибкий. Например, он не поддерживает интерфейс. Я делаю, например, тяжелое использование 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, это может быть хорошим вариантом.

 Смежные вопросы

  • Нет связанных вопросов^_^