2016-09-19 48 views
5

Mam web api metoda, która przyjmuje format jako parametr, który zwraca zarówno xml i json.Typ danych, które zwracają metoda jest DataTable.W formacie json wszystko wygląda dobrze, ale w formacie XML schemat datatable i niektóre inne atrybuty w Zwracają także węzły xml. Jak powrócić prosty xml, który zawiera tylko dane datatable? Używam również QueryStringMapping w WebApiConfig.Jak usunąć węzeł schematu w interfejsie WWW, jeśli formatem zwracanym jest xml?

to kod WebApiConfig

public static void Register(HttpConfiguration config) 
{ 
    config.MapHttpAttributeRoutes(); 
    config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{action}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 
    config.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("format", "json", new MediaTypeHeaderValue("application/json"))); 
    config.Formatters.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("format", "xml", new MediaTypeHeaderValue("application/xml"))); 
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented; 
} 

Jest to kod pseudo metody kontrolera

[BasicAuthentication] 
[Route("api/{tablename}")] 
[HttpGet] 
public IHttpActionResult Get(string tablename, string orders = "", int limit = 100) 
{ 
    DataTable dt = new DataTable{TableName="resource"}; 
    //... Database connection and getting result 
    return Ok(new Response{ limit = limit,count=dt.Rows.Count, data =dt }); 
} 

a model odpowiedzi

public class Response 
{ 
    public int limit { get; set; } 
    public int count { get; set; } 
    public DataTable data { get; set; } 

} 

Przykład zwróconej xml

<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <limit>1</limit> 
    <count>1</count> 
    <data> 
    <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet"> 
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="resource" msdata:UseCurrentLocale="true"> 
    <xs:complexType> 
    <xs:choice minOccurs="0" maxOccurs="unbounded"> 
    <xs:element name="resource"> 
    <xs:complexType> 
    <xs:sequence> 
    <xs:element name="ID" type="xs:long" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    </xs:choice> 
    </xs:complexType> 
    </xs:element> 
    </xs:schema> 
    <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> 
    <DocumentElement> 
    <resource diffgr:id="resource1" msdata:rowOrder="0"> 
    <ID>1</ID> 
    </resource> 
    </DocumentElement> 
    </diffgr:diffgram> 
    </data> 
    </Response> 

Podsumowując, chcę zwrócić tylko węzły zasobów w węźle danych bez żadnego atrybutu.

+0

używać atrybutów podobnych do przykładów w tym pytaniu http://stackoverflow.com/questions/12590801/remove-namespace-in-xml-from-asp-net-web-api – Thorarins

+0

Jest coś dziwne, że formater o json działa w sposób zamierzony, ale formatuje około xml, na przykład config.Formatters.XmlFormatter.UseXmlSerializer = true; nie działa w WebApiConfig – mayk

+1

json nie ma tej samej przestrzeni nazw i informacji o schemacie, że xml pozwala to, dlaczego działa lepiej z jsonem – Thorarins

Odpowiedz

2

Znalazłem odpowiedź po opublikowaniu tego pytania. Problemem jest XmlSchema obiektu danych. Zapisywanie niestandardowego serializera XML z zerową wartością null w interfejsie GetSchema interfejsu IXmlSerializable z przesłonięciem. Niestandardowy serializator to there.