• asp.net webapi 序列化为xml 时实体属性增加<![CDATA[]]>防止特殊字符


         有时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设置为housedetail
    100         public string HouseDetail { get; set; }
    101 
    102         [XmlElement("housedetail")]
    103         public XmlNode[] CDataContent
    104         {
    105             get
    106             {
    107                 return new XmlNode[]
    108                 {
    109                     new XmlDocument().CreateCDataSection(HouseDetail)
    110                 };
    111             }
    112             set
    113             {
    114                 HouseDetail =
    115                     value[0].Value;
    116             }
    117         }
    118 
    119         //方式二,这里把CDataContent设置为housedetail
    120         //[XmlElement("housedetail")]
    121         //public XmlNode CDataContent
    122         //{
    123         //    get
    124         //    {
    125         //        // 这种方式这里代码比上面的要多运行一定次数。
    126         //        XmlNode node = new XmlDocument().CreateNode(XmlNodeType.CDATA, "", "");
    127         //        node.InnerText = HouseDetail;
    128         //        return node;
    129         //    }
    130         //    set
    131         //    {
    132         //        HouseDetail
    133         //            = value.Value;
    134         //    } //省略则CDataContent不会被序列化
    135         //}
    136 
    137         //以下属性省略。。。。
    138     }
    139 
    140     /// <summary>
    141     /// 去除xml命名空间的 序列化类
    142     /// </summary>
    143     public class CustomNamespaceXmlFormatter : XmlMediaTypeFormatter
    144     {
    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>
  • 相关阅读:
    一套C#语言的日志控制系统
    unity自义定摇杆
    2014 西安邀请赛小结
    Poj 1112 Team Them Up!
    Poj 1112 Rebuilding Roads(树形DP+背包)
    USACO Cow Pedigrees
    Poj 2284 That Nice Euler Circuit
    LA 3942 Remember the Word
    HDU 3065 病毒侵袭持续中
    HDU 2896 病毒侵袭
  • 原文地址:https://www.cnblogs.com/Dream618/p/5820585.html
Copyright © 2020-2023  润新知