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>[email protected]</Email>
<Phone i:nil="true"/> ...
I would like this to work
<ACCOUNT>
<id>22</id>
<City i:nil="true"/>
<Country i:nil="true"/>
<Email>[email protected]</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>[email protected]</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
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:
config.Formatters.XmlFormatter.UseXmlSerializer = true;
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Runtime.Serialization;
using System.Web.Http;
namespace CutomXmlFormater.Controllers
{
//[DataContract(Namespace = "")]
public class Foo
{
//[DataMember]
public string Bar { get; set; }
}
public class FoosController : ApiController
{
// GET api/foos/5
public Foo Get(int id)
{
return new Foo() { Bar = "Test" };
}
}
}
Config (App_Start/WebApiConfig)
//(Use this is you don't go the data contact and model annotation route)
config.Formatters.XmlFormatter.UseXmlSerializer = true;
Result
Either (With annotation and data contact):
<Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Bar>Test</Bar></Foo>
Or (with XML serialiser route):
<Foo xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Bar>Test</Bar></Foo>