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 嵌套数组的序列化方法相关推荐

  1. php 对象转xml字符串_php方法simplexml_load_string()解析xml转数组失败

    用php方法simplexml_load_string()解析xml成数组失败,总是返回false. 找了很多方法,终于知道在php用simplexml_load_string()解析xml成数组的时 ...

  2. javascript数组——新建数组、访问数组、遍历数组的方法、数组对象的方法、冒泡排序算法、json的正反序列化

    目录 数组 通过构造函数的三种方法 字面量创建数组方式 访问数组 遍历数组的方法 遍历:遍历就是把数组中的元素从头到尾都访问一次 操作数组对象的方法 删除和添加 delete与Vue.delete区别 ...

  3. ASP.NET提取多层嵌套json数据的方法

    ASP.NET提取多层嵌套json数据的方法 本文实例讲述了ASP.NET利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,具体例子如下. 假设需要提取的json字符串如下: ...

  4. scala解析xml_Scala XML处理–文字,序列化,解析,保存和加载示例

    scala解析xml XML is a form of semi structured data which is organized in the form of trees. Semi struc ...

  5. Flatten Nested Arrays(展平嵌套数组)

    这个题目是在一个公司现场面谈的时候的一个题目.虽然对这种找工作上来就做题目的现象比较反感. 但是大环境如此,也只能被蹂躏了. 中文描述 题目要求比较简单:[1,2,[3],[[4]],5,6] -&g ...

  6. php xml对象解析_php解析xml 的四种简单方法(附实例)

    XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument. ...

  7. PHP怎么读写XML?(四种方法)

    PHP怎么读写XML?(四种方法) 一.总结 1.这四种方法中,字符串的方式是最原始的方法.SimpleXML和DOM扩展是属于基于树的解析器,把整个文档存储为树的数据结构中,需要把整个文档都加载到内 ...

  8. ES更新嵌套数组(使用Java API)

    最近在做一个需求,一开始的时候以为用es脚本能搞定,耽搁了一天半时间. 后来用了Java client 的api来做,效率快多了. package com.XXX.XXXX.XXX;import co ...

  9. Android -- 创建XML文件对象及其序列化, pull解析XML文件

    1. 创建XML文件对象及其序列化 示例代码:(模拟以xml格式备份短信到SD卡) SmsInfo.java, bean对象 /*** 短信的业务bean* @author Administrator ...

最新文章

  1. 模拟浏览器自动化测试工具Selenium之一eclipse集成开发部署篇
  2. 门限的限意思是什么_门限是什么意思_门限英文翻译
  3. ajax success function_Ajax封装
  4. 2018暑假集训测试六总结
  5. 但自去年封测后的cqbgbbs
  6. JVM调优总结:一些概念
  7. 局域网聊天服务器(openfire)安装与配置
  8. 是什么门的缩写_什么是FBA
  9. 为什么说软件测试很重要?
  10. 各类常用食物的热能含量及营养价值
  11. 罗大佑的童年用计算机咋弹,罗大佑《童年》吉他弹奏教学-520吉他网
  12. 苹果Swift语言入门教程
  13. 全差分运放阻抗匹配计算(四)
  14. 广西首届网络安全选拔赛 MISC Wirteup
  15. 国信证券学习系列(3)
  16. 心跳计算机游戏,聪明人才能玩的游戏 解谜游戏《心跳 Heartbeats》讲述
  17. echarts 随屏幕大小改变大小chart.resize()
  18. 2023沈阳航空航天大学计算机考研信息汇总
  19. flask与Django的比较
  20. 模拟器和服务器共享文件,多玩手游模拟器和电脑上的文件共享设置教程

热门文章

  1. 第十七天 JavaScript、Vue详细总结
  2. Unity Point Light没用的问题
  3. 微信小程序测试(简单项目测试)
  4. hdu 1045Fire Net (建图 、二分匹配)
  5. java的 jre是什么_Java中JDK和JRE的区别是什么?它们的作用分别是什么?
  6. 真·“拜师学艺”?2021中科院开源之夏,开源大牛1V1万元奖金只等你来!
  7. 计算机是如何做减法的?
  8. ProE二次开发 Creo二次开发 MCADEx Tools 工程图管理工具
  9. Windows下如何查看被占用进程及结束进程?
  10. Handler、Thread、HandlerThread三者的区别