asp.net webapi 序列化为xml 时实体属性增加<![CDATA[]]>防止特殊字符
有时webapi在序列化xml时,可能需要给某些带有html或特殊字符(如 < > & /)的字段加上<![CDATA[]]> 已防止影响xml正常数据,如果使用.aspx视图那可直接在前台绑定字段时直接加入<![CDATA[]]>,webapi只有后台代码,那只能在后台做了,如下。
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Formatting;
using System.Threading.Tasks;
using System.Web.Http;
using System.Xml;
using System.Xml.Serialization; namespace MvcApplication1.Controllers
{
public class TestController : ApiController
{
[HttpGet]
[HttpPost]
public HttpResponseMessage HouseTest(string city)
{
//手动构造数据,这里应该是调用构造数据。
var info = new GetHouseCountInfo()
{
CityName = "北京",
CountInfo = new List<CountInfo>()
{
new CountInfo()
{
Data = "2016-08-30",
HouseDetail = "描述信息1111等。。。"
},
new CountInfo()
{
Data = "2016-08-30",
HouseDetail = "描述信息2222等。。。"
},
new CountInfo()
{
Data = "2016-08-30",
HouseDetail = "描述信息333等。。。"
}
}
};
//序列化实体与赋值
var model = new HouseCountRoot {GetHouseInfo = new GetHouseCountInfo()};
model.GetHouseInfo.CountInfo = info.CountInfo;
model.Result = "";
model.Message = "";
model.GetHouseInfo.CityName = info.CityName; return new HttpResponseMessage()
{
Content =
new ObjectContent<HouseCountRoot>(model, new CustomNamespaceXmlFormatter() {UseXmlSerializer = true},
new System.Net.Http.Headers.MediaTypeHeaderValue("application/xml") {CharSet = "utf-8"}),
StatusCode = HttpStatusCode.OK
};
}
} [XmlRoot("houses")]
public class HouseCountRoot
{
[XmlElement("result")]
public string Result { get; set; } [XmlElement("message")]
public string Message { get; set; } [XmlElement("housecount")]
public GetHouseCountInfo GetHouseInfo { get; set; }
} public class GetHouseCountInfo
{
/// <summary>
/// 城市名称
/// </summary>
[XmlElement("cityname")]
public string CityName { get; set; } /// <summary>
/// 房源数信息
/// </summary>
[XmlElement("countinfo")]
public List<CountInfo> CountInfo { get; set; }
} public class CountInfo
{
/// <summary>
/// 日期
/// </summary>
[XmlElement("data")]
public string Data { get; set; } /// <summary>
/// 加<![CDATA[ ]]>数据字段
/// </summary>
[XmlIgnore] //方式1,这里属性设置忽略,把CDataContent设置为housedetail
public string HouseDetail { get; set; } [XmlElement("housedetail")]
public XmlNode[] CDataContent
{
get
{
return new XmlNode[]
{
new XmlDocument().CreateCDataSection(HouseDetail)
};
}
set
{
HouseDetail =
value[].Value;
}
} //方式二,这里把CDataContent设置为housedetail
//[XmlElement("housedetail")]
//public XmlNode CDataContent
//{
// get
// {
// // 这种方式这里代码比上面的要多运行一定次数。
// XmlNode node = new XmlDocument().CreateNode(XmlNodeType.CDATA, "", "");
// node.InnerText = HouseDetail;
// return node;
// }
// set
// {
// HouseDetail
// = value.Value;
// } //省略则CDataContent不会被序列化
//} //以下属性省略。。。。
} /// <summary>
/// 去除xml命名空间的 序列化类
/// </summary>
public class CustomNamespaceXmlFormatter : XmlMediaTypeFormatter
{
public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content,
TransportContext transportContext)
{
var xns = new XmlSerializerNamespaces();
foreach (var attribute in type.GetCustomAttributes(true))
{
var xmlRootAttribute = attribute as XmlRootAttribute;
if (xmlRootAttribute != null)
{
xns.Add(string.Empty, xmlRootAttribute.Namespace);
}
} if (xns.Count == )
{
xns.Add(string.Empty, string.Empty);
} var task = Task.Factory.StartNew(() =>
{
var serializer = new XmlSerializer(type);
serializer.Serialize(writeStream, value, xns);
}); return task;
}
}
}
结果如下。
<?xml version="1.0"?>
<houses>
<result />
<message />
<housecount>
<cityname>北京</cityname>
<countinfo>
<data>2016-08-30</data>
<housedetail><![CDATA[描述信息1111等。。。]]></housedetail>
</countinfo>
<countinfo>
<data>2016-08-30</data>
<housedetail><![CDATA[描述信息2222等。。。]]></housedetail>
</countinfo>
<countinfo>
<data>2016-08-30</data>
<housedetail><![CDATA[描述信息333等。。。]]></housedetail>
</countinfo>
</housecount>
</houses>
asp.net webapi 序列化为xml 时实体属性增加<![CDATA[]]>防止特殊字符的更多相关文章
- @JsonInclude(Include.NON_NULL) resttemplate 传递实体参数时 序列化为json时 空字符串不参与序列化
@JsonInclude(Include.NON_NULL) resttemplate 传递实体参数时 序列化为json时 空字符串不参与序列化 https://www.cnblogs.com/sup ...
- 匿名对象序列化为XML
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...
- java 使用xom对象数据序列化为xml、反序列化、Preferences相关操作小案例
package org.rui.io.xml; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import ...
- 序列化为XML
java类序列化成xml 方法[转] 今天看了下JAVA序列化.还是一知半解.怎么也没有弄明白,怎么序列化成XML文件.处入半解状态.在网上找了很多,大部分是理论上的.没有实际的例子.功夫不负有心人, ...
- C#实体类序列化为XML
这两天,应要求做一个C/S的小程序,考虑到程序简洁小巧,存数据的方式不使用数据库,而是直接存入XML文档中保存.为了把复杂实体类里面的属性存入XML,我们可以使用C#有的反射机制,做一个简单的通用工具 ...
- 【C#】使用C#将类序列化为XML
直接上代码: public static class XmlSerializer { public static void SaveToXml(string filePath, object sour ...
- 将long数字序列化为json时,转换为字符串
由于javascript中所有数字都是64位的浮点数,所以整数只能精确的表示53bit长的数字. 在从server得到的json数据中,有ID是长整数类型,在客户端根据此ID生成的link也是不准确的 ...
- 如何由XSD自动生成XML和实体类
项目中有时候要用XML作为数据源,因此需要定义XML文件和相应的类,最佳方法是首先定义XSD,然后自动生成实体类,最后生成XML和填充数据:读取XML数据源的时候,首先用XSD验证XML数据格式,然后 ...
- .NET中XML序列化和反序列化常用类和用来控制XML序列化的属性总结(XmlSerializer,XmlTypeAttribute,XmlElementAttribute,XmlAttributeAttribute,XmlArrayAttribute...)
序列化和反序列化是指什么? 序列化(seriallization): 将对象转化为便于传输的数据格式, 常见的序列化格式:二进制格式,字节数组,json字符串,xml字符串.反序列化(deserial ...
随机推荐
- java系统性能分析
netstat -ano | findstr 31900 注意最后是pid 堆栈的作用: 线程死锁分析 辅助CPU过高分析 线程资源不足分析 性能瓶颈分析 关键线程异常退出 Windows:在运行ja ...
- vb6里面dim和set的区别
dim是作用于变量 声明变量并分配存储空间 set作用于对象 将对象引用赋给变量或属性 例子: dim A as collection set A=new collection 等效于 di ...
- java 线程协作 yield()
yield():方法的定义 调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程. 但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取 ...
- D3+svg 案例
<!doctype html><html lang="en"><head> <meta charset="UTF-8" ...
- spring之BeanFactory
spring的IOC容器能够帮我们自动new对象,对象交给spring管之后我们不用自己手动去new对象了.那么它的原理是什么呢?是怎么实现的呢?下面我来简单的模拟一下spring的机制,相信看完之后 ...
- China Mobile 免流原理
用户添加包头之类(SSR软件),最后连接上了Server. 这个过程因为修改了数据包(混淆)以及服务器使用移动IP. 服务器得到信息后通过计费系统漏洞137 138端口等再返回给用户. 整个过程最重要 ...
- Docker 有什么优势?
1.什么是容器? 依托与linux 内核功能的虚拟化技术 2. docker 是什么? 能够把应用程序自动部署到容器的开源引擎 3. docker 跟原有的工具有何区别? 传统的部署模式是:安装(包管 ...
- CSS Shake – 摇摆摇摆!动感的 CSS 抖动效果
CSS Shake 是一套 CSS3 动画特效,让页面的 DOM 元素实现各种效果的抖动(Shake),这些效果可以轻松的被应用到按钮.LOGO 以及图片等元素.所有这些效果都是只需要单一的标签,加上 ...
- [Basic] The most basic things about java
[Basic] The most basic things about java // */ // ]]> [Basic] The most basic things about java ...
- 在Android中实现service动态更新UI界面
之前曾介绍过Android的UI设计与后台线程交互,据Android API的介绍,service一般是在后台运行的,没有界面的.那么如何实现service动态更新UI界面呢?案例:通过service ...