需求

将XML文件中的数据经过转换后插入到数据库中。

参考

C#实体类和XML的相互转换

https://blog.csdn.net/pan_junbiao/article/details/82938027

遇到的问题

错误描述

XML反序列化出错,XML 文档(2, 2)中有错误

解决方案

在实体类的字段要加上XmlElement属性

https://www.cnblogs.com/wuyunblog/p/6625747.html

具体实例

实体类和XML转换的帮助类

 1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Linq;
5 using System.Text;
6 using System.Threading.Tasks;
7 using System.Xml.Serialization;
8
9 namespace conDealXML
10 {
11 public static class XmlSerializeHelper
12 {
13
14 /// <summary>
15 /// 将实体对象转换成XML
16 /// </summary>
17 /// <typeparam name="T">实体类型</typeparam>
18 /// <param name="obj">实体对象</param>
19 public static string XmlSerialize<T>(T obj)
20 {
21 try
22 {
23 using (StringWriter sw = new StringWriter())
24 {
25 Type t = obj.GetType();
26 XmlSerializer serializer = new XmlSerializer(obj.GetType());
27 serializer.Serialize(sw, obj);
28 sw.Close();
29 return sw.ToString();
30 }
31 }
32 catch (Exception ex)
33 {
34 throw new Exception("将实体对象转换成XML异常", ex);
35 }
36 }
37
38 /// <summary>
39 /// 将XML转换成实体对象
40 /// </summary>
41 /// <typeparam name="T">实体类型</typeparam>
42 /// <param name="strXML">XML</param>
43 public static T DESerializer<T>(string strXML) where T : class
44 {
45 try
46 {
47 using (StringReader sr = new StringReader(strXML))
48 {
49 XmlSerializer serializer = new XmlSerializer(typeof(T));
50 return serializer.Deserialize(sr) as T;
51 }
52 }
53 catch (Exception ex)
54 {
55 throw new Exception("将XML转换成实体对象异常", ex);
56 }
57
58 }
59 }
60 }

实体类

 1 using System;
2 using System.Xml.Serialization;
3 namespace Model
4 {
5 /// <summary>
6 /// 功能: 实体类 (权限)
7 /// 创建人:CodeSmith
8 /// 创建日期:2019/12/25
9 /// </summary>
10 [Serializable]
11 [XmlRoot(ElementName = "Action")]
12 public partial class Action
13 {
14 public Action()
15 { }
16 #region Model
17 /// <summary>
18 /// 权限ID
19 /// </summary>
20 public short? ActionID {get; set;}
21 /// <summary>
22 /// 权限名字
23 /// </summary>
24 public string Name {get; set;}
25 /// <summary>
26 /// 权限标志代码(用于功能的判定)
27 /// </summary>
28 public string Code {get; set;}
29 /// <summary>
30 /// 权限的路径
31 /// </summary>
32 public string Url {get; set;}
33 /// <summary>
34 /// 排序
35 /// </summary>
36 public short? Sort {get; set;}
37 /// <summary>
38 /// 权限类型
39 /// </summary>
40 public int? ActionType {get; set;}
41 /// <summary>
42 /// 备注
43 /// </summary>
44 public string Memo {get; set;}
45 /// <summary>
46 /// 审核状态
47 /// </summary>
48 public short? Check {get; set;}
49 /// <summary>
50 /// 添加时间
51 /// </summary>
52 public DateTime? InsertTime {get; set;}
53 /// <summary>
54 /// 修改时间
55 /// </summary>
56 public DateTime? ModifyTime {get; set;}
57 #endregion
58 }
59 }

XML文件

 1 <?xml version="1.0" encoding="gb2312"?>
2 <MyConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3 <Roles>
4 <Role>
5 <Actions>
6 <Action>
7 <ActionID>133</ActionID>
8 <Name>用户查询</Name>
9 <Code>041303</Code>
10 <Url>/AddValue/addvalue_list</Url>
11 <Sort>4</Sort>
12 <ActionType>0</ActionType>
13 <Check>1</Check>
14 <InsertTime>2019-12-24T11:18:00</InsertTime>
15 <ModifyTime xsi:nil="true" />
16 </Action>
17 </Actions>
18 <Menus>
19 <Menu>
20 <MenuID>165</MenuID>
21 <Title>用户管理</Title>
22 <ParentID>160</ParentID>
23 <Layer>4</Layer>
24 <Path>0/1/3/160</Path>
25 <Sort>12</Sort>
26 <Url>http://</Url>
27 <Image>http://</Image>
28 <IsVip>false</IsVip>
29 <MenuType>0</MenuType>
30 <Level>0</Level>
31 <Check>1</Check>
32 <InsertTime>2019-12-21T09:21:00</InsertTime>
33 <ModifyTime>2019-12-21T09:23:00</ModifyTime>
34 </Menu>
35 </Menus>
36 <RoleID></RoleID>
37 <Name>超级管理员</Name>
38 </Role>
39 <Role>
40 </Role>
41 </Roles>
42 </MyConfig>

控制台程序,执行转换的过程

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6 using System.Xml;
7
8 namespace conDealXML
9 {
10 class Program
11 {
12 static void Main(string[] args)
13 {
14 XmlDocument doc = new XmlDocument();
15 doc.Load("Roles.Config");
16
17 XmlNode xn_MyConfig = doc.SelectSingleNode("MyConfig");
18 XmlNodeList xnl_Roles = xn_MyConfig.ChildNodes;
19 XmlNode xn_Roles_Roles = xnl_Roles[0];
20 XmlNodeList xnl_Roles_Role = xn_Roles_Roles.ChildNodes;
21 XmlNode xn_Role_Admin = xnl_Roles_Role[0];//第一个Role,为超级管理员
22 XmlNodeList xnl_Role_Admin = xn_Role_Admin.ChildNodes;
23 foreach (XmlNode item in xnl_Role_Admin)
24 {
25 if (item.Name == "Actions")
26 {
27 XmlNodeList xnl_Actions = item.ChildNodes;//获取到所有的Action
28 foreach (XmlNode xn in xnl_Actions)
29 {
30 Model.Action model = XmlSerializeHelper.DESerializer<Model.Action>(xn.OuterXml);
31 new DAL.Action().Add(model);
32 }
33 }
34 if (item.Name == "Menus")
35 {
36 XmlNodeList xnl_Menus = item.ChildNodes;//获取到所有的Action
37 foreach (XmlNode xn in xnl_Menus)
38 {
39 Model.Menu model = XmlSerializeHelper.DESerializer<Model.Menu>(xn.OuterXml);
40 new DAL.Menu().Add(model);
41 }
42 }
43 }
44
45 Console.ReadKey();
46 }
47 }
48 }

将XML转换为实体的更多相关文章

  1. XML与 实体的相互转化

    using System; using System.Linq; using System.Xml; using System.Reflection; using System.Data; using ...

  2. XML外部实体(XXE)注入详解

    ###XML与xxe注入基础知识 1.XMl定义 XML由3个部分构成,它们分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言:可扩展的样式语言(Ex ...

  3. Pikachu-XXE(xml外部实体注入漏洞)

    XXE -"xml external entity injection"既"xml外部实体注入漏洞".概括一下就是"攻击者通过向服务器注入指定的xml ...

  4. 【XXE学习】XML外部实体注入

    一.XML外部实体注入介绍 1.1 XXE简介 XML外部实体注入(XML External Entity Injection)也就是人们(mian shi guan )常说的XXE啦,见名知意,就是 ...

  5. c# XML和实体类之间相互转换(序列化和反序列化)[砖]

    link: http://blog.okbase.net/haobao/archive/62.html by: 好饱 我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlU ...

  6. C# XML和实体类之间相互转换(序列化和反序列化)

    我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. using System; using System.Collections.Ge ...

  7. XML转换为对象操作类详解

    //XML转换为对象操作类 //一,XML与Object转换类 using System.IO; using System.Runtime.Serialization.Formatters.Binar ...

  8. 三层架构中bll层把datatable转换为实体model的理解

    看了很多人的项目,很多都是用到三层架构,其中BLL层中有一种将DataTable转换为实体的方法.一直没有明白为啥要这样做,今天特意去搜索了一下,如果没有答案我是准备提问,寻求解答了.还好找到一个相关 ...

  9. XML转换为Map通用算法实现 Java版本(Stax实现)

    目前项目中需要将XML转换为Map,下面给出了自己的代码实现. 后续将为大家提供Dom版本的实现. 请各路大神给予各种优良实现. 场景: 在项目中需要解析XML文本字符串,需要将XML文本字符串映射为 ...

随机推荐

  1. jmeter接口测试多数据组合登陆场景

    一.安装好Java运行环境 百度下载JDK并且配置JAVA环境的教程一搜一大把,这里我就不详说了 二.运行JMETER 打开安装目录的bin文件中的jmeter.bat文件 三.添加程序 1.添加线程 ...

  2. ios中多线程GCD NSOperation NSThread 相关的操作解析

    //1.GCD 继承自C语言 优点 简单方便 //开启一个子线程处理耗时的操作 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIO ...

  3. 三. Vue组件化

    1. 认识组件化 1.1 什么是组件化 人面对复杂问题的处理方式 任何一个人处理信息的逻辑能力都是有限的,所以当面对一个非常复杂的问题时我们不太可能一次性搞定一大堆的内容. 但是我们人有一种天生的能力 ...

  4. MySQL的两种日志类型,redo log,binlog

    文章内容学习:极客时间-林晓彬老师-MySQL实战45讲 整理而得 我们知道MySQL数据库在发生意外宕机的情况下,可以将数据恢复到历史的某个时间点,能实现这个功能依靠的是日志,MySQL提供两种类型 ...

  5. Bootstrap(修改中)

    表格 斑马表格 <table class="table-striped"> </table> 鼠标经过表格的hover效果 <table class= ...

  6. Splay树求第k大模板

    今天上午借着休息日得机会手撸了一下模板,终于对着模板调出来了.prev和next占用了std namespace里面的东西,然后报警我上次给关了所以.....就花了3个小时吧. inline加不加无所 ...

  7. moviepy音视频开发:音频合成类AudioArrayClip介绍

    ☞ ░ 前往老猿Python博文目录 ░ AudioArrayClip类是AudioClip的直接子类,用于从一个numpy音频数组构建音频剪辑.AudioArrayClip类只有一个构造方法,在构造 ...

  8. PyQt(Python+Qt)学习随笔:QToolBox工具箱currentItem对应的index、text、name、icon、ToolTip属性

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在Designer中,toolBox主要有如下属性: 可以看到,toolBox的属性主要是与当前项相 ...

  9. 第15.2节 PyCharm支持Python解释器的配置调整

    上节介绍了PyCharm的安装与简单使用,本节介绍PyCharm相关的配置调整,以支持在PyCharm环境下集成Python解释器进行程序的编译. 一. 工程配置调整 在执行文件前,可能需要对PyCh ...

  10. go学习49天

    写文件操作 func OpenFile(name string,flag int,perm FileMode) (file *File,err error)