需求

将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. python3使用HTMLTestRunner生成测试报告

    自动化测试运行完了需要直观的了解测试结果,需要用到第三方的模块HTMLTestRunner. 一:下载 HTMLTestRunner 下载路径:https://pypi.python.org/pypi ...

  2. Java基础教程——安装JDK

    视频讲解:https://www.bilibili.com/video/av48196406/?p=3 使用[jdk-8u144-windows-x64.exe] 下载地址: 链接:https://p ...

  3. iOS UIImageView contentMode使用详解

    UIImageView 的contentMode这个属性是用来设置图片的显示方式,如居中.居右,是否缩放等,有以下几个常量可供设定:UIViewContentModeScaleToFill //填满i ...

  4. Spring Boot 项目瘦身指南,瘦到不可思议!129M->1.3M

    之前在 从使用传统Web框架到切换到Spring Boot后的总结 中提到关于 Spring Boot 编译打包,Spring Boot 应用程序不用额外部署到外部容器中,可以直接通过 Maven 命 ...

  5. MySQL错误日志(Error Log)

    错误日志是一个文本文件,记录了 MySQL Server 每次启动和关闭的详细信息以及运行过程中所有较为严重的警告和错误信息.在遇到问题时,应该首先查看这个文件. 如何开启 使用命令 SHOW VAR ...

  6. 简单dp水题

    #include <bits/stdc++.h> using namespace std; #define limit (100 + 5)//防止溢出 #define INF 0x3f3f ...

  7. 第15.40节、PyQt(Python+Qt)实战:moviepy实现MP4视频转gif动图的工具

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 在写<第15.39节.splitDockWidget和 ...

  8. PageRank 算法-Google 如何给网页排名

    公号:码农充电站pro 主页:https://codeshellme.github.io 在互联网早期,随着网络上的网页逐渐增多,如何从海量网页中检索出我们想要的页面,变得非常的重要. 当时著名的雅虎 ...

  9. 【Alpha冲刺阶段】Scrum Meeting Daily3

    [Alpha冲刺阶段]Scrum Meeting Daily3 1.会议简述 会议开展时间 2020/5/24 8:00-8:15 PM 会议基本内容摘要 每日汇报 个人进度.遇到的困难.明日的计划. ...

  10. 谈谈 javascript的 call 和 apply用法

    定义: ECMAScript规范为所有函数都包含两个方法(这两个方法非继承而来),call和apply,这两个函数都是在特定的作用域中调用函数,能改变函数的作用域,实际上是改变函数体内 this 的值 ...