2016-09-19 18 views
5

私はxmlとjsonの両方を返すことを提供するパラメータとしてformatをとるWeb APIメソッドを持っています。メソッドが返すデータ型はDataTable.In json形式ですが、XML形式のデータテーブルと他の属性また、私はWebApiConfigでQueryStringMappingを使用しています。戻り値の形式がXMLの場合、Web APIのスキーマノードを削除するにはどうすればよいですか?

これは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; 
} 

これはコントローラメソッドの擬似コード

[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 }); 
} 

および応答モデル

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

} 

返される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> 
の一例です

要約すると、属性なしでデータノード内のリソースノードだけを返したいとします。

+0

このサンプルのサンプルのような属性を使用してください。http://stackoverflow.com/questions/12590801/remove-namespace-in-xml-from-asp-net-web-api – Thorarins

+0

何かありますJsonについてのFormatterがIntendedなどのように動作しているが、config.Formatters.XmlFormatter.UseXmlSerializer = trueのようなxmlのフォーマットについては不思議です。 WebApiConfigで動作しない – mayk

+1

jsonは、xmlが許可するのと同じ名前空間とスキーマ情報を持っていないので、jsonでうまくいく理由 – Thorarins

答えて

2

この質問を投稿した後、回答が見つかりました。問題は、datatableオブジェクトのXmlSchemaです。それをオーバーライドしてIXmlSerializableインターフェイスのGetSchemaでnullを返すカスタムdatatable xmlシリアライザを記述します。カスタムシリアライザはthere.

関連する問題