有时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[]]>防止特殊字符的更多相关文章

  1. @JsonInclude(Include.NON_NULL) resttemplate 传递实体参数时 序列化为json时 空字符串不参与序列化

    @JsonInclude(Include.NON_NULL) resttemplate 传递实体参数时 序列化为json时 空字符串不参与序列化 https://www.cnblogs.com/sup ...

  2. 匿名对象序列化为XML

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...

  3. java 使用xom对象数据序列化为xml、反序列化、Preferences相关操作小案例

    package org.rui.io.xml; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import ...

  4. 序列化为XML

    java类序列化成xml 方法[转] 今天看了下JAVA序列化.还是一知半解.怎么也没有弄明白,怎么序列化成XML文件.处入半解状态.在网上找了很多,大部分是理论上的.没有实际的例子.功夫不负有心人, ...

  5. C#实体类序列化为XML

    这两天,应要求做一个C/S的小程序,考虑到程序简洁小巧,存数据的方式不使用数据库,而是直接存入XML文档中保存.为了把复杂实体类里面的属性存入XML,我们可以使用C#有的反射机制,做一个简单的通用工具 ...

  6. 【C#】使用C#将类序列化为XML

    直接上代码: public static class XmlSerializer { public static void SaveToXml(string filePath, object sour ...

  7. 将long数字序列化为json时,转换为字符串

    由于javascript中所有数字都是64位的浮点数,所以整数只能精确的表示53bit长的数字. 在从server得到的json数据中,有ID是长整数类型,在客户端根据此ID生成的link也是不准确的 ...

  8. 如何由XSD自动生成XML和实体类

    项目中有时候要用XML作为数据源,因此需要定义XML文件和相应的类,最佳方法是首先定义XSD,然后自动生成实体类,最后生成XML和填充数据:读取XML数据源的时候,首先用XSD验证XML数据格式,然后 ...

  9. .NET中XML序列化和反序列化常用类和用来控制XML序列化的属性总结(XmlSerializer,XmlTypeAttribute,XmlElementAttribute,XmlAttributeAttribute,XmlArrayAttribute...)

    序列化和反序列化是指什么? 序列化(seriallization): 将对象转化为便于传输的数据格式, 常见的序列化格式:二进制格式,字节数组,json字符串,xml字符串.反序列化(deserial ...

随机推荐

  1. 实战使用Axure设计App,使用WebStorm开发(4) – 实现页面UI

    系列文章 实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求  实战使用Axure设计App,使用WebStorm开发(2) – 创建 Ionic 项目   实战使 ...

  2. 透析Express.js

    前言 最近,本屌在试用Node.js,在寻找靠谱web框架时发现了Express.js.Express.js在Node.js社区中是比较出名web框架,而它的定位是“minimal and flexi ...

  3. Atitit  数据存储的分组聚合 groupby的实现attilax总结

    Atitit  数据存储的分组聚合 groupby的实现attilax总结 1. 聚合操作1 1.1. a.标量聚合 流聚合1 1.2. b.哈希聚合2 1.3. 所有的最优计划的选择都是基于现有统计 ...

  4. 快速入门系列--TSQL-01基础概念

    作为一名程序员,对于SQL的使用算是基础中的基础,虽然也写了很多年的SQL,但常常还是记不清一些常见的命令,故而通过一篇博文巩固相关的记忆,并把T-SQL本身的一些新特性再进行一次学习. 首先回顾基础 ...

  5. 《Qt Quick 4小时入门》学习笔记

    http://edu.csdn.net/course/detail/1042/14804?auto_start=1   Qt Quick 4小时入门 第五章:Qt Quick里的信号与槽   QML中 ...

  6. web前端攻击详解

    前端攻击成因 在web网页的脚本中,有些部分的显示内容会依据外界输入值而发生变化,而如果这些声称html的程序中存在问题,就会滋生名为跨站脚本的安全隐患 XSS跨站脚本攻击: 英文全称cross-si ...

  7. C#委托(delegate)

    C#中委托(delegate)是一种安全地封装方法的类型,委托是面向对象的.类型安全的. 使用委托的步骤: 1.声明委托 public delegate void DelegateHandler(st ...

  8. CentOS6.5使用createrepo搭建本地源

    本地搭建本地yum源采用的rpm全部来自CentOS-6.5-bin-DVD1&DVD2; 我的是在虚拟机环境安装,先检查我的操作系统版本: 1 2 3 4 [adam@ultraera ~] ...

  9. art-template用户注册方法

    应用场景nodejs Express框架,使用art-template模板引擎. 后台注册方法代码: var template = require('art-template'); template. ...

  10. C++程序设计之四书五经[转自2004程序员杂志]--上篇

    C++程序设计之四书五经 作者:荣耀 C++是一门广泛用于工业软件研发的大型语言.它自身的复杂性和解决现实问题的能力,使其极具学术研究价值和工业价值.和C语言一样,C++已经在许多重要的领域大获成功. ...