I'm working on a MVC WebAPI, that uses EF with POCO classes for storage. What I want to do is get rid of the namespace from the XML, so that the endpoints would return and accept xml objects without it. (json works just fine)
<ACCOUNT xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Platform.Services.AccountService.Data">
<id>22</id>
<City i:nil="true"/>
<Country i:nil="true"/>
<Email>testas@email.com</Email>
<Phone i:nil="true"/> ...
I would like this to work
<ACCOUNT>
<id>22</id>
<City i:nil="true"/>
<Country i:nil="true"/>
<Email>testas@email.com</Email>
<Phone i:nil="true"/> ...
Hopefully without having to decorate the POCO's with a bunch of attributes.
I've set up a test solution for this, and indeed, these methods are beeing hit (must be some other problem in my system). Anyways - the result that I get using this solutions is this:
<ArrayOfAccount>
<Account>
<id>22</id>
<name>TestAcc</name>
<parentid xmlns:d3p1="http://www.w3.org/2001/XMLSchema-instance" d3p1:nil="true"/>
<status_id xmlns:d3p1="http://www.w3.org/2001/XMLSchema-instance" d3p1:nil="true"/>
<Email>Test@Test.com</Email>
</Account>
</ArrayOfAccount>
Got rid of the schema on top, but the properties are now messed up :( Here's a link to a sample project
Maybe you could try with this:
Replace default XmlFormatter with your own:
And impement it using XmlSerializer, with specifying empty namespace during serialization, like this:
Custom XML serializer was stolen from here, and as such is untested.
This should serialize objects w/o writing the namespace. I'm not sure if it will work OOTB for deserialization, you'd may have to experiment with
XmlSerializer.Deserialize()
overload that provides events and handle UnknownElement or UnknownNode event.I have customized Boris's answer to MVC Webapi 5. Use either of the following http headers render the result using the CustomFormatter:
accept: application/xml
accept: text/xml
WebApiConfig.cs :
CustomXmlFormatter.cs :
This answer here is spot on the mark Remove namespace in XML from ASP.NET Web API.\
If you don't want to decorate your POCO's at all use the 1st option:
If you use option 2, you may need to add a reference to
System.Runtime.Serialization
Assuming a post like this with Accept set correct:
GET http:// ANY OLD SERVER/api/foos/5 Accept: application/xml
Controller
}
Config (App_Start/WebApiConfig)
Result
Either (With annotation and data contact):
Or (with XML serialiser route):
It's been awhile since I messed with MVC 4, but we ended up replacing the default formatter with the XmlSerializer like so:
This might help... I know we also customized the property names using attributes on the POCOs which you said you don't want to do, but that's because we wanted them to be camel-cased.