将XML转换为实体
需求
将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转换为实体的更多相关文章
- XML与 实体的相互转化
using System; using System.Linq; using System.Xml; using System.Reflection; using System.Data; using ...
- XML外部实体(XXE)注入详解
###XML与xxe注入基础知识 1.XMl定义 XML由3个部分构成,它们分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言:可扩展的样式语言(Ex ...
- Pikachu-XXE(xml外部实体注入漏洞)
XXE -"xml external entity injection"既"xml外部实体注入漏洞".概括一下就是"攻击者通过向服务器注入指定的xml ...
- 【XXE学习】XML外部实体注入
一.XML外部实体注入介绍 1.1 XXE简介 XML外部实体注入(XML External Entity Injection)也就是人们(mian shi guan )常说的XXE啦,见名知意,就是 ...
- c# XML和实体类之间相互转换(序列化和反序列化)[砖]
link: http://blog.okbase.net/haobao/archive/62.html by: 好饱 我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlU ...
- C# XML和实体类之间相互转换(序列化和反序列化)
我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. using System; using System.Collections.Ge ...
- XML转换为对象操作类详解
//XML转换为对象操作类 //一,XML与Object转换类 using System.IO; using System.Runtime.Serialization.Formatters.Binar ...
- 三层架构中bll层把datatable转换为实体model的理解
看了很多人的项目,很多都是用到三层架构,其中BLL层中有一种将DataTable转换为实体的方法.一直没有明白为啥要这样做,今天特意去搜索了一下,如果没有答案我是准备提问,寻求解答了.还好找到一个相关 ...
- XML转换为Map通用算法实现 Java版本(Stax实现)
目前项目中需要将XML转换为Map,下面给出了自己的代码实现. 后续将为大家提供Dom版本的实现. 请各路大神给予各种优良实现. 场景: 在项目中需要解析XML文本字符串,需要将XML文本字符串映射为 ...
随机推荐
- LeetCode双周赛#34
5492. 分割字符串的方案数 #组合公式 #乘法原理 #区间分割 题目链接 题意 给定01二进制串\(s\),可将\(s\)分割为三个非空 字符串\(s_1,s_2,s_3\),即(\(s_1+s_ ...
- D. Circle Game 题解(对称博弈)
题目链接 题目大意 t组数据(t<=100) 给你一个半径d和步数k,你最开始在原点(0,0)每次可以让x坐标增加k,或者y坐标增加k 两人轮流走,求谁最后不能走了,谁就输了,都是最优博弈 输的 ...
- 精尽MyBatis源码分析 - 文章导读
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- 流量控制--6.Classful Queuing Disciplines (qdiscs)
Classful Queuing Disciplines 可以使用classful qdisc的代理来解锁Linux流量控制的灵活性和控制力.classful qdisc可以附加过滤器,允许将报文重定 ...
- SQL,T-SQL简介
SQL: 结构化查询语言(Structured Query Language), 简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系型数据库系 ...
- C和指针---结构和联合
一.结构 1.C提供了两种类型的聚合数据类型---数组.结构.数组是相同类型的元素集合,它的每个元素长度相同,故可以通过下标引用或指针间接访问来选择的;而结构可以把不同类型的值存储在一起,由于结构的成 ...
- Spring Boot 2.4.0 发布,配置文件重大调整,不要乱升级!!
前段时间 Spring Boot 2.4.0 发布了,栈长作了一个新特性全盘解读,其中介绍了一个很重要的变革,那就是配置文件. 配置文件可是每个框架的核心,不得不搞清楚,所以,这篇栈长就带大家深入实战 ...
- 第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解
第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解 一. 引言 上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类 ...
- XFF SSTI 模板注入 [BJDCTF2020]The mystery of ip
转自https://www.cnblogs.com/wangtanzhi/p/12328083.html SSTI模板注入:之前也写过:https://www.cnblogs.com/wangtanz ...
- Gradle上传依赖到私服(nexus)
子模块配置 buildscript { repositories { mavenLocal() maven { url "http://maven.aliyun.com/nexus/cont ...