博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
asp.net webapi 序列化为xml 时实体属性增加<![CDATA[]]>防止特殊字符
阅读量:6982 次
发布时间:2019-06-27

本文共 5997 字,大约阅读时间需要 19 分钟。

     有时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
() 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
(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 ///
76 /// 城市名称 77 /// 78 [XmlElement("cityname")] 79 public string CityName { get; set; } 80 81 ///
82 /// 房源数信息 83 /// 84 [XmlElement("countinfo")] 85 public List
CountInfo { get; set; } 86 } 87 88 public class CountInfo 89 { 90 ///
91 /// 日期 92 /// 93 [XmlElement("data")] 94 public string Data { get; set; } 95 96 ///
97 /// 加数据字段 98 /// 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 ///
141 /// 去除xml命名空间的 序列化类142 /// 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 
2
3
4
5
6
北京
7
8
2016-08-30 9
10
11
12
2016-08-3013
14
15
16
2016-08-3017
18
19
20

 

转载于:https://www.cnblogs.com/Dream618/p/5820585.html

你可能感兴趣的文章
Centos下安装FTP并进行虚拟用户访问方式配置
查看>>
python day09
查看>>
拆系数FFT及其部分优化
查看>>
cocos2dx3.8 ios打包脚本编写
查看>>
wordpress搭建博客上传begin主题The themes is locked to another domain
查看>>
2019-04-16 SpringMVC 学习笔记
查看>>
C10K问题
查看>>
慕课网3-13编程练习:采用flex弹性布局制作页面主导航
查看>>
线程中死锁的demo
查看>>
canvas-7globleCompositeOperation.html
查看>>
Java并发(具体实例)——几个例子
查看>>
【待补】java开发Web Service
查看>>
两个有用的数组扩展方法
查看>>
英语发音规则---H字母
查看>>
js进阶 10-11/12 表单伪类选择器的作用
查看>>
C#中Invoke的用法
查看>>
pxe无人值守安装操作系统
查看>>
UESTC 2014 Summer Training #11 Div.2
查看>>
[笔记] SDRAM读写控制
查看>>
size_t的定义
查看>>