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 ...
随机推荐
- DDD~领域服务的规约模式
回到目录 规 约(Specification)模式:第一次看到这东西是在microsoft NLayer项目中,它是微软对DDD的解说,就像petshop告诉了我们MVC如何使用一样,这个规约模式最重 ...
- Java程序员的日常 —— 多进程开发
最近再弄进程管理相关的工作,因此必要的就涉及到各种系统下关于进程的管理. 这里简单的介绍下: 如何在Java中执行命令 在windows下肯定是dos命令了,而在linux则为shell命令.执行的方 ...
- [Java工具]Java常用在线工具集合.
转载申明: 转载自http://www.hollischuang.com/Grepcode SearchCode ProcessOn json.cn diffchecker MaHua .马克飞象 . ...
- Atititi 版本管理 rc final rtm ga release 软件的生命周期中一般分4个版本
Atititi 版本管理 rc final rtm ga release 软件的生命周期中一般分4个版本 RC=Release Candidate,含义是"发布候选版",它不是最终 ...
- Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法
Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...
- atitit.事件驱动的总结attilax
atitit.事件驱动的总结attilax Keyboard 基于的的ed 与 mouse 基础的ed Kb base on focus .... Mouse base on mouse mo ...
- python 数据的拷贝
# -*- config=utf-8 -*- #数据的拷贝 a=[1,2,3,4,5,6,"a","C"]; b=a;# a 与 b 的地址空间相同 a.app ...
- CCNA网络工程师学习进程(5)路由器和交换机的登录安全配置和vlan划分
本节详细介绍路由器和交换机的登录安全配置以及VLAN划分的原理. (1)登录安全配置: 路由器登录有两种验证方式:有本地验证方式和远程验证方式.本地登录验证方式可以配置用户名和密码也可 ...
- CCNA基础 IP地址子网划分
计算机是一个非常神奇的物品,它的核心算法是凌驾于任何代码架构.然而互联网网络( Internat )作为整个生态的基础资源.什么?你还不会子网划分? 没关系,看到子网掩码不要怕.因为它无非就是问你 & ...
- 微软BI 之SSIS 系列 - 使用 SQL Profilling Task (数据探测) 检测数据源数据
开篇介绍 SQL Profilling Task 可能我们很多人都没有在 SSIS 中真正使用过,所以对于这个控件的用法可能也不太了解.那我们换一个讲法,假设我们有这样的一个需求 - 需要对数据库表中 ...