Search code examples
c#xmlasp.net-mvcxml-serializationasp.net-web-api

Adjust MVC 4 WebApi XmlSerializer to lose the nameSpace


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


Solution

  • 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>