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 ...
随机推荐
- LeetCode之“链表”:Add Two Numbers
题目链接 题目要求: You are given two linked lists representing two non-negative numbers. The digits are stor ...
- Zip操作的工具类
/** * Copyright 2002-2010 the original author is huanghe. */package com.ucap.web.cm.webapp.util; ...
- "《算法导论》之‘图’":不带权二分图最大匹配(匈牙利算法)
博文“二分图的最大匹配.完美匹配和匈牙利算法”对二分图相关的几个概念讲的特别形象,特别容易理解.本文介绍部分主要摘自此博文. 还有其他可参考博文: 趣写算法系列之--匈牙利算法 用于二分图匹配的匈牙利 ...
- 面试之路(28)-反转链表(reverse ListNode)
反转链表: java类 public class ListNode{ int key; ListNode next; } 思路分析: 需要三个指针,current,prev和next. current ...
- JSON 在Ajax数据交换中的简单运用
随着浏览器内核更新,原先的json.js在最新的谷歌浏览下不管用了,运行报错,特此修改下代码,不使用json.js,使用Object自带的json转换方法,修改时间,2016年10月26日. 首先需要 ...
- 自定义UICollectionViewLayout 布局实现瀑布流
自定义 UICollectionViewLayout 布局,实现瀑布流:UICollectionView和UICollectionViewCell 另行创建,这只是布局文件, 外界控制器只要遵守协议并 ...
- 如何安装Pycharm官方统计代码行插件
最近一直想统计Pycharm的总计代码行数,找到了官方的统计行数插件,发现效果还不错. 官方代码统计插件指导: https://plugins.jetbrains.com/plugin/4509-st ...
- 【转载】Linux Cache Mechanism Summary(undone)
http://www.cnblogs.com/LittleHann/p/3904909.html 目录 1. 缓存机制简介 2. 内核缓存机制 3. 内存缓存机制 4. 文件缓存机制 5. 数据库缓存 ...
- Kotlin : Retrofit + RxAndroid + Realm
https://jqs7.com/kotlin-retrofit-rxandroid-realm/ 原作者:Ahmed Rizwan 原文链接:Kotlin : Retrofit + RxAndroi ...
- clear read-only status问题的解决
IDEA系工具可能会报出的错误. 解决方法见官方文档吧:Changing Read-Only Status of Files : https://www.jetbrains.com/help/ide ...