asp.net webapi 序列化為xml 時實體屬性增加<![CDATA[]]>防止特殊字元

來源:互聯網
上載者:User

標籤:gif   html   sdn   innertext   net   調用   too   ctc   字元   

有時webapi在序列化xml時,可能需要給某些帶有html或特殊字元(如 < > & /)的欄位加上<![CDATA[]]> 已防止影響xml正常資料,如果使用.aspx視圖那可直接在前台綁定欄位時直接加入<![CDATA[]]>,webapi只有後台代碼,那隻能在後台做了,如下。

 

  1 using System;  2 using System.Collections.Generic;  3 using System.IO;  4 using System.Net;  5 using System.Net.Http;  6 using System.Net.Http.Formatting;  7 using System.Threading.Tasks;  8 using System.Web.Http;  9 using System.Xml; 10 using System.Xml.Serialization; 11  12 namespace MvcApplication1.Controllers 13 { 14     public class TestController : ApiController 15     { 16         [HttpGet] 17         [HttpPost] 18         public HttpResponseMessage HouseTest(string city) 19         { 20             //手動構造資料,這裡應該是調用構造資料。 21             var info = new GetHouseCountInfo() 22             { 23                 CityName = "北京", 24                 CountInfo = new List<CountInfo>() 25                 { 26                     new CountInfo() 27                     { 28                         Data = "2016-08-30", 29                         HouseDetail = "描述資訊1111等。。。" 30                     }, 31                     new CountInfo() 32                     { 33                         Data = "2016-08-30", 34                         HouseDetail = "描述資訊2222等。。。" 35                     }, 36                     new CountInfo() 37                     { 38                         Data = "2016-08-30", 39                         HouseDetail = "描述資訊333等。。。" 40                     } 41                 } 42             }; 43             //序列化實體與賦值 44             var model = new HouseCountRoot {GetHouseInfo = new GetHouseCountInfo()}; 45             model.GetHouseInfo.CountInfo = info.CountInfo; 46             model.Result = ""; 47             model.Message = ""; 48             model.GetHouseInfo.CityName = info.CityName; 49  50             return new HttpResponseMessage() 51             { 52                 Content = 53                     new ObjectContent<HouseCountRoot>(model, new CustomNamespaceXmlFormatter() {UseXmlSerializer = true}, 54                         new System.Net.Http.Headers.MediaTypeHeaderValue("application/xml") {CharSet = "utf-8"}), 55                 StatusCode = HttpStatusCode.OK 56             }; 57         } 58     } 59  60     [XmlRoot("houses")] 61     public class HouseCountRoot 62     { 63         [XmlElement("result")] 64         public string Result { get; set; } 65  66         [XmlElement("message")] 67         public string Message { get; set; } 68  69         [XmlElement("housecount")] 70         public GetHouseCountInfo GetHouseInfo { get; set; } 71     } 72  73     public class GetHouseCountInfo 74     { 75         /// <summary> 76         /// 城市名稱 77         /// </summary> 78         [XmlElement("cityname")] 79         public string CityName { get; set; } 80  81         /// <summary> 82         /// 房源數資訊 83         /// </summary> 84         [XmlElement("countinfo")] 85         public List<CountInfo> CountInfo { get; set; } 86     } 87  88     public class CountInfo 89     { 90         /// <summary> 91         /// 日期 92         /// </summary> 93         [XmlElement("data")] 94         public string Data { get; set; } 95  96         /// <summary> 97         /// 加<![CDATA[ ]]>資料欄位 98         /// </summary> 99         [XmlIgnore] //方式1,這裡屬性設定忽略,把CDataContent設定為housedetail100         public string HouseDetail { get; set; }101 102         [XmlElement("housedetail")]103         public XmlNode[] CDataContent104         {105             get106             {107                 return new XmlNode[]108                 {109                     new XmlDocument().CreateCDataSection(HouseDetail)110                 };111             }112             set113             {114                 HouseDetail =115                     value[0].Value;116             }117         }118 119         //方式二,這裡把CDataContent設定為housedetail120         //[XmlElement("housedetail")]121         //public XmlNode CDataContent122         //{123         //    get124         //    {125         //        // 這種方式這裡代碼比上面的要多運行一定次數。126         //        XmlNode node = new XmlDocument().CreateNode(XmlNodeType.CDATA, "", "");127         //        node.InnerText = HouseDetail;128         //        return node;129         //    }130         //    set131         //    {132         //        HouseDetail133         //            = value.Value;134         //    } //省略則CDataContent不會被序列化135         //}136 137         //以下屬性省略。。。。138     }139 140     /// <summary>141     /// 去除xml命名空間的 序列化類別142     /// </summary>143     public class CustomNamespaceXmlFormatter : XmlMediaTypeFormatter144     {145         public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content,146             TransportContext transportContext)147         {148             var xns = new XmlSerializerNamespaces();149             foreach (var attribute in type.GetCustomAttributes(true))150             {151                 var xmlRootAttribute = attribute as XmlRootAttribute;152                 if (xmlRootAttribute != null)153                 {154                     xns.Add(string.Empty, xmlRootAttribute.Namespace);155                 }156             }157 158             if (xns.Count == 0)159             {160                 xns.Add(string.Empty, string.Empty);161             }162 163             var task = Task.Factory.StartNew(() =>164             {165                 var serializer = new XmlSerializer(type);166                 serializer.Serialize(writeStream, value, xns);167             });168 169             return task;170         }171     }172 }

 

結果如下。

 1 <?xml version="1.0"?> 2 <houses> 3   <result /> 4   <message /> 5   <housecount> 6     <cityname>北京</cityname> 7     <countinfo> 8       <data>2016-08-30</data> 9       <housedetail><![CDATA[描述資訊1111等。。。]]></housedetail>10     </countinfo>11     <countinfo>12       <data>2016-08-30</data>13       <housedetail><![CDATA[描述資訊2222等。。。]]></housedetail>14     </countinfo>15     <countinfo>16       <data>2016-08-30</data>17       <housedetail><![CDATA[描述資訊333等。。。]]></housedetail>18     </countinfo>19   </housecount>20 </houses>
  

asp.net webapi 序列化為xml 時實體屬性增加<![CDATA[]]>防止特殊字元

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.