C# XML 嵌套数组的序列化方法
XML示例
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:QQQ="http://www.sss.org.cn" xmlns:WAC="http://www.aaa.com"><Person><Name>小莫</Name><Age>20</Age><items><QQQ:item><QQQ:paraname>文化课</QQQ:paraname><QQQ:paravalue>SOD1323DS</QQQ:paravalue></QQQ:item></items></Person><Person><Name>小红</Name><Age>20</Age><items><QQQ:item><QQQ:paraname>数学课</QQQ:paraname><QQQ:paravalue>SID1323DSD</QQQ:paravalue></QQQ:item><QQQ:item><QQQ:paraname>英语课</QQQ:paraname><QQQ:paravalue>SID000000</QQQ:paravalue></QQQ:item></items></Person>
</root>
其中 items是个List<item>的数组
类的代码,这个是重点!!!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace WindowsFormsApplication1
{[System.SerializableAttribute()][System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)][System.Xml.Serialization.XmlRootAttribute("root", IsNullable = false)]public class BaseInfo{[System.Xml.Serialization.XmlElementAttribute("Person")]public List<Person> PersonList { get; set; }}[System.SerializableAttribute()][System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)][System.Xml.Serialization.XmlRootAttribute("Person", IsNullable = false)]public class Person{public string Name { get; set; }public int Age { get; set; }[System.Xml.Serialization.XmlElementAttribute("items")]//标识Apublic items items { get; set; }}[System.SerializableAttribute()][System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.sss.org.cn")]//Namespace属性不需要可以不填写[System.Xml.Serialization.XmlRootAttribute("items", IsNullable = false)]public class items//此类名必须与节点名相同 标识A{[System.Xml.Serialization.XmlElementAttribute("item")]public List<Item> ItemList { get; set; }}[System.SerializableAttribute()][System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.sss.org.cn")]//Namespace属性不需要可以不填写[System.Xml.Serialization.XmlRootAttribute("item", IsNullable = false)]public class item //类名必须与节点名相同!{public string paraname { get; set; }public string paravalue { get; set; }}
}
需要注意的是 items的类名必须和XML中的元素名相同,上面代码中 写着 标识A 的名称必须一致
序列化方法类
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Serialization;namespace XmlTool
{public class XmlSerializeHelper{#region 使用演示//Request 类名//patientIn 实例名//strxml xml字符串//序列化演示//string strxml = XmlSerializeHelper.XmlSerialize<Request>(patientIn);//反序列化演示//Request r = XmlSerializeHelper.DESerializer<Request>(strxml); public Dictionary<string, string> students = new Dictionary<string, string>();#endregion/ <summary>/ 实体类转换成XML/ </summary>/ <typeparam name="T">类名</typeparam>/ <param name="obj">T类名的实例</param>/ <returns></returns>//public static string XmlSerialize<T>(T obj)//{// using (StringWriter sw = new StringWriter())// {// Type t = obj.GetType();// XmlSerializer serializer = new XmlSerializer(obj.GetType());// serializer.Serialize(sw, obj);// sw.Close();// return sw.ToString();// }//}/// <summary>/// 将一个对象序列化为XML字符串/// </summary>/// <param name="o">要序列化的对象</param>/// <param name="encoding">编码方式</param>/// <param name="DicPrefix">需要指定的前缀对应,格式为 key为命名空间,value为前缀</param>/// <returns>序列化产生的XML字符串</returns>public static string XmlSerialize(object o, Encoding encoding, Dictionary<string, string> DicPrefix){if (o == null)throw new ArgumentNullException("o");if (encoding == null)throw new ArgumentNullException("encoding");string xml = "";try{using (MemoryStream stream = new MemoryStream()){XmlWriterSettings settings = new XmlWriterSettings();settings.Encoding = encoding;//OmitXmlDeclaration表示不生成声明头,默认是false,OmitXmlDeclaration为true,会去掉<?xml version="1.0" encoding="UTF-8"?>//settings.OmitXmlDeclaration = true;XmlWriter writer = XmlWriter.Create(stream, settings);#region 指定命名空间前缀的方法//强制指定命名空间,覆盖默认的命名空间,可以添加多个,如果要在xml节点上添加指定的前缀,可以在跟节点的类上面添加[XmlRoot(Namespace = "http://www.w3.org/2001/XMLSchema-instance", IsNullable = false)],Namespace指定哪个值,xml节点添加的前缀就是哪个命名空间(这里会添加ceb)XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();if (DicPrefix!=null){NamespacesSpecifiedPrefix(namespaces, DicPrefix);}//namespaces.Add(参数1, 参数2);//解读:"参数1"为要使用的前缀,对应类中使用"参数2"的命名空间的节点#endregionXmlSerializer serializer = new XmlSerializer(o.GetType());serializer.Serialize(writer, o, namespaces);writer.Close();stream.Position = 0;using (StreamReader reader = new StreamReader(stream, encoding)){xml = reader.ReadToEnd();}}}catch (Exception ex){}return xml;}/// <summary>/// 指定修改的前缀,遍历字典添加/// </summary>/// <param name="namespaces">要添加命名空间的对象</param>/// <param name="DicPrefix">包含命名空间和前缀的字典</param>private static void NamespacesSpecifiedPrefix(XmlSerializerNamespaces namespaces, Dictionary<string, string> DicPrefix){foreach (KeyValuePair<string, string> kvp in DicPrefix){namespaces.Add(kvp.Value, kvp.Key);}}/// <summary>/// XML转换成实体类-方法1/// </summary>/// <typeparam name="T">对应的类</typeparam>/// <param name="strXML">XML字符串</param>/// <returns></returns>public static T DESerializer<T>(string strXML) where T : class{try{using (StringReader sr = new StringReader(strXML)){XmlSerializer serializer = new XmlSerializer(typeof(T));return serializer.Deserialize(sr) as T;}}catch (Exception ex){return null;}}/// <summary>/// XML转换成实体类-方法2/// </summary>/// <param name="xmlStr"></param>/// <param name="type"></param>/// <returns></returns>public static object DeserializeFromXml(string xmlStr, Type type){try{using (StringReader sr = new StringReader(xmlStr)){XmlSerializer xs = new XmlSerializer(type);return xs.Deserialize(sr);}}catch (Exception ex){throw (ex);}}//Request//}
}
使用方法
private static void aaa()
{BaseInfo baseInfo = new BaseInfo();List<Person> personList = new List<Person>();Person p1 = new Person();p1.Name = "小莫";p1.Age = 20;List<Item> books = new List<Item>();Item book = new Item();book.paraname = "文化课";book.paravalue = "SOD1323DS";books.Add(book);p1.items = new items();p1.items.ItemList = books;Person p2 = new Person();p2.Name = "小红";p2.Age = 20;List<Item> books2 = new List<Item>();Item book2 = new Item();book2.paraname = "数学课";book2.paravalue = "SID1323DSD";books2.Add(book2);Item book3 = new Item();book3.paraname = "英语课";book3.paravalue = "SID000000";books2.Add(book3);p2.items = new items();p2.items.ItemList = books2;personList.Add(p1);personList.Add(p2);baseInfo.PersonList = personList;//类转XML,带前缀string postXml4 = XmlSerializeHelper.XmlSerialize(baseInfo, Encoding.UTF8, new Dictionary<string, string>() { { "http://www.aaa.com", "WAC" }, { "http://www.sss.org.cn", "QQQ" } });//XML转XMLBaseInfo BL = (BaseInfo)XmlSerializeHelper.DeserializeFromXml(postXml2, typeof(BaseInfo));//XML转类Console.ReadLine();
}
以上
小技巧:当对应XML的类很复杂,序列化又出错的时候,可以分模块,单独提出一个节点元素与对应的一个小类进行序列化测试
例如:单独将Item拿出来进行反序列化,但一定注意最外层不能有前缀,且如果XML中使用了前缀,一定要带命名空间xmlns
<item xmlns:QQQ="http://www.sss.org.cn"><QQQ:paraname>数学课</QQQ:paraname><QQQ:paravalue>SID1323DSD</QQQ:paravalue></item>
string fff = System.IO.File.ReadAllText("./XMLFile3.xml");
Item bk = (Item)XmlSerializeHelper.DeserializeFromXml(fff, typeof(Item));//转为Item类
即可用这种方法分步进行测试以找出序列化错误的地方
学习资料来自:https://www.cnblogs.com/mq0036/p/12049881.html
C# XML 嵌套数组的序列化方法相关推荐
- php 对象转xml字符串_php方法simplexml_load_string()解析xml转数组失败
用php方法simplexml_load_string()解析xml成数组失败,总是返回false. 找了很多方法,终于知道在php用simplexml_load_string()解析xml成数组的时 ...
- javascript数组——新建数组、访问数组、遍历数组的方法、数组对象的方法、冒泡排序算法、json的正反序列化
目录 数组 通过构造函数的三种方法 字面量创建数组方式 访问数组 遍历数组的方法 遍历:遍历就是把数组中的元素从头到尾都访问一次 操作数组对象的方法 删除和添加 delete与Vue.delete区别 ...
- ASP.NET提取多层嵌套json数据的方法
ASP.NET提取多层嵌套json数据的方法 本文实例讲述了ASP.NET利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,具体例子如下. 假设需要提取的json字符串如下: ...
- scala解析xml_Scala XML处理–文字,序列化,解析,保存和加载示例
scala解析xml XML is a form of semi structured data which is organized in the form of trees. Semi struc ...
- Flatten Nested Arrays(展平嵌套数组)
这个题目是在一个公司现场面谈的时候的一个题目.虽然对这种找工作上来就做题目的现象比较反感. 但是大环境如此,也只能被蹂躏了. 中文描述 题目要求比较简单:[1,2,[3],[[4]],5,6] -&g ...
- php xml对象解析_php解析xml 的四种简单方法(附实例)
XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument. ...
- PHP怎么读写XML?(四种方法)
PHP怎么读写XML?(四种方法) 一.总结 1.这四种方法中,字符串的方式是最原始的方法.SimpleXML和DOM扩展是属于基于树的解析器,把整个文档存储为树的数据结构中,需要把整个文档都加载到内 ...
- ES更新嵌套数组(使用Java API)
最近在做一个需求,一开始的时候以为用es脚本能搞定,耽搁了一天半时间. 后来用了Java client 的api来做,效率快多了. package com.XXX.XXXX.XXX;import co ...
- Android -- 创建XML文件对象及其序列化, pull解析XML文件
1. 创建XML文件对象及其序列化 示例代码:(模拟以xml格式备份短信到SD卡) SmsInfo.java, bean对象 /*** 短信的业务bean* @author Administrator ...
最新文章
- 模拟浏览器自动化测试工具Selenium之一eclipse集成开发部署篇
- 门限的限意思是什么_门限是什么意思_门限英文翻译
- ajax success function_Ajax封装
- 2018暑假集训测试六总结
- 但自去年封测后的cqbgbbs
- JVM调优总结:一些概念
- 局域网聊天服务器(openfire)安装与配置
- 是什么门的缩写_什么是FBA
- 为什么说软件测试很重要?
- 各类常用食物的热能含量及营养价值
- 罗大佑的童年用计算机咋弹,罗大佑《童年》吉他弹奏教学-520吉他网
- 苹果Swift语言入门教程
- 全差分运放阻抗匹配计算(四)
- 广西首届网络安全选拔赛 MISC Wirteup
- 国信证券学习系列(3)
- 心跳计算机游戏,聪明人才能玩的游戏 解谜游戏《心跳 Heartbeats》讲述
- echarts 随屏幕大小改变大小chart.resize()
- 2023沈阳航空航天大学计算机考研信息汇总
- flask与Django的比较
- 模拟器和服务器共享文件,多玩手游模拟器和电脑上的文件共享设置教程
热门文章
- 第十七天 JavaScript、Vue详细总结
- Unity Point Light没用的问题
- 微信小程序测试(简单项目测试)
- hdu 1045Fire Net (建图 、二分匹配)
- java的 jre是什么_Java中JDK和JRE的区别是什么?它们的作用分别是什么?
- 真·“拜师学艺”?2021中科院开源之夏,开源大牛1V1万元奖金只等你来!
- 计算机是如何做减法的?
- ProE二次开发 Creo二次开发 MCADEx Tools 工程图管理工具
- Windows下如何查看被占用进程及结束进程?
- Handler、Thread、HandlerThread三者的区别