xml序列化和反序列化(一)
最近项目中需要调用第三方webservice,入参和出参采用xml格式,大致如下:
入参:
<?xml version="1.0" encoding="utf-8"?>
<RequestParams>
<PatientsName/>
<PatientsID/>
</RequestParams>
出参:
<?xml version="1.0" encoding="utf-8"?>
<PacsResult>
<successe>true</successe>
<msg>成功</msg>
<reports>
<report>
<PatientsSex></PatientsSex>
<PatientsName></PatientsName>
</report>
</reports>
</PacsResult>
关于入参,项目中封装的有入参实体,实体类如下:
public class rep
{
public string PatientsName { get; set; }
public string PatientsID { get; set; }
}
现在就需要怎么将入参实体转换为xml格式字符串,代码如下:
/// <summary>
/// 序列化
/// </summary>
/// <param name="T">泛型t</param>
/// <returns></returns>
public static string XmlSerializerSR<T>(T t)
{
MemoryStream Stream = new MemoryStream();
XmlSerializer xml = new XmlSerializer(typeof(T));
try
{
//序列化对象
xml.Serialize(Stream, t);
}
catch (InvalidOperationException)
{
throw;
}
Stream.Position = ;
StreamReader sr = new StreamReader(Stream);
string str = sr.ReadToEnd(); sr.Dispose();
Stream.Dispose(); return str;
}
测试结果:
<?xml version="1.0"?>
<RequestParams xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<PatientsName>Cui Jian Hong</PatientsName>
<PatientsID>P57748</PatientsID>
</RequestParams>
有些人看到觉得这和入参不一样,
<?xml version="1.0"?>少了utf-8,<RequestParams》多了个xmlns(xml命名空间,我这里不作过多介绍)这个玩意;强迫症犯了,要求必须和入参一摸一样,我就尝试用另外一种方法:
public static string XmlSerializerXTW<T>(T t)
{
using (MemoryStream ms = new MemoryStream())
{
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
//Add an empty namespace and empty value
ns.Add("", "");
XmlTextWriter textWriter = new XmlTextWriter(ms, Encoding.GetEncoding("UTF-8"));
//StreamWriter streamWriter = new StreamWriter(ms, Encoding.GetEncoding("utf-8"))效果一样;
XmlSerializer serializer = new XmlSerializer(typeof(T));
serializer.Serialize(textWriter, t, ns); string xmlMessage = Encoding.UTF8.GetString(ms.GetBuffer());
xmlMessage = System.Text.RegularExpressions.Regex.Replace(xmlMessage, "^[^<]", "");
ms.Close();
textWriter.Close();
return xmlMessage;
}
}
看到代码里为什么多了个正则表达式替换呢,原因是因为如果不加这个,序列化后是这样的
?<?xml version="1.0" encoding="utf-8"?>
<RequestParams>
<PatientsName>Cui Jian Hong</PatientsName>
<PatientsID>P57748</PatientsID>
</RequestParams>
注意第一个字符,不是粘贴错误,哈哈,实际就是多个问号;蛋疼了,网上找了半天,最后就这么解决了,哪位大神知道为什么,请告之。
写到这里有些人觉得,这么搞有点牵强,不完美,怎么办呢,还有终极杀招,自定义xml,无非就是拼接呗:可以这么搞:
/// <summary>
/// 拼接入参
/// </summary>
/// <param name="inParams"></param>
/// <returns></returns>
public static string CreateInParams(Dictionary<string, string> inParams,string inParamName)
{
string ret = string.Empty;
XmlDocument doc = new XmlDocument();
doc.AppendChild(doc.CreateXmlDeclaration("1.0", "utf-8", null)); XmlElement xnIn = doc.CreateElement(inParamName);
doc.AppendChild(xnIn);
foreach (var de in inParams)
{
XmlElement xn = doc.CreateElement(de.Key);
xn.InnerText = de.Value;
xnIn.AppendChild(xn);
}
ret = doc.OuterXml;
return ret;
}
当然代码里是入参Dictionary<string, string>,不过这个可以任意定义,实体也行,数组也行。。。我这里只提供一个思路。
关于出参解析,请看下篇介绍
xml序列化和反序列化(一)的更多相关文章
- XML 序列化与反序列化
XML序列化与反序列化 1.将一个类转化为XML文件 /// <summary> /// 对象序列化成XML文件 /// </summary> /// <param na ...
- XmlSerializer 对象的Xml序列化和反序列化
http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html 这篇随笔对应的.Net命名空间是System.Xm ...
- C#的XML序列化及反序列化
webservice在工作中用到的很多,基本都是以XML格式问通讯内容,其中最关键的就是XML串的序列化及反序列化. XML的运用中有两种信息传递,一种为XML的请求信息,另一种为返回信息,要运用XM ...
- .NET XML序列化与反序列化
闲着没事,写了两个通用的XML序列化与反序列化的方法. 贴出来当作笔记吧! /// <summary> /// XML序列化 /// </summary> /// <ty ...
- XmlSerializer 对象的Xml序列化和反序列化,XMLROOT别名设置
这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中 ...
- c# XML序列化与反序列化
c# XML序列化与反序列化 原先一直用BinaryFormatter来序列化挺好,可是最近发现在WinCE下是没有办法进行BinaryFormatter操作,很不爽,只能改成了BinaryWrite ...
- Xml序列化、反序列化帮助类
之前从网络上找了一个Xml处理帮助类,并整理了一下,这个帮助类针对Object类型进行序列化和反序列化,而不需要提前定义Xml的结构,把它放在这儿供以后使用 /// <summary> / ...
- Windows phone 之XML序列化与反序列化
为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...
- C#操作Xml:XmlSerializer 对象的Xml序列化和反序列化
这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中的对 ...
- C#实现接口xml序列化与反序列化
C#实现接口xml序列化与反序列化 C#中接口无法被xml序列化,提示不支持.百度和bing也搜不到,只好自己动手写了 原理上肯定支持,.Net自己的xml序列化有一个IXmlSerializab ...
随机推荐
- C 打印格式小记
转自:http://blog.csdn.net/fivedoumi/article/details/7077504 d,lx,ld,,lu,这几个都是输出32位的 hd,hx,hu,这几个都是输出16 ...
- DB Query Analyzer 6.03, the most excellent Universal DB Access tools on any Microsoft Windows OS
DB Query Analyzer 6.03, the most excellent Universal database Access tools on any Microsoft Wind ...
- iOS 10正式发布:十大新功能,更注重人性化
6月14日凌晨消息,苹果公司举行2016年WWDC全球开发者大会,介绍了watch OS.tv OS.OS X以及iOS 10系统的新特性. 据苹果介绍,iOS 10在锁屏.Siri.地图等十个各方面 ...
- LeetCode之“字符串”:ZigZag Conversion
题目链接 题目要求: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of ...
- java--加强之 Java5的线程并发库
转载请申明出处:http://blog.csdn.net/xmxkf/article/details/9945499 01. 传统线程技术回顾 创建线程的两种传统方式: 1.在Thread子类覆盖的r ...
- 创建Sencha touch第一个应用
最近学习Sencha touch ,是一个菜鸟级别.废话不多说,让我们来创建Sencha touch的第一应用. 首先,我们下载Sencha touch2.0 sdk 和SDK工具. SDK工具直接 ...
- obj-c编程10:Foundation库中类的使用(4)[文件管理,查询当前进程信息]
接上一篇文件管理博文.我们可以用NSPathUtilities.h中包含的NSString函数和分类扩展来以兼容的方式处理路径.下面凡是有系统编程经验的童鞋都知道是啥意思了: #import < ...
- JAVA线程与线程、进程与进程间通信
I.线程与线程间通信 一.基本概念以及线程与进程之间的区别联系: 关于进程和线程,首先从定义上理解就有所不同1.进程是什么?是具有一定独立功能的程序.它是系统进行资源分配和调度的一个独立单位,重点在系 ...
- hover变化图片
<div class="icon width mar"> <div class="cpzs_tit"></div> < ...
- Eclipse RCP中超长任务单线程,异步线程处理
转自:http://www.blogjava.net/mydearvivian/articles/246028.html 在RCP程序中,常碰到某个线程执行时间比较很长的情况,若处理不好,用户体验度是 ...