Xml文件相关操作

Xml文件相关操作

C#中的XML是一种可扩展标记语言(Extensible Markup Language),用于存储和交换数据。在C#中,我们可以使用内置的System.Xml命名空间来处理和操作XML数据。

一、关键概念

1. 标签(Tags)

XML 使用标签来标识数据的起始和结束。标签由尖括号(<>)包围,可以包含标签名称和属性。

2. 元素(Elements)

元素是包含数据的基本单位。它由一个起始标签和一个结束标签组成。例如,<name>John</name> 是一个名为 “name” 的元素,其内容为 “John”。

3. 属性(Attributes)

属性提供关于元素的附加信息。它们以名称-值对的形式存在于元素的起始标签中。例如,<person age="25">John</person> 中的 “age” 是一个属性,其值为 “25”。

4. 命名空间(Namespaces)

命名空间用于避免元素和属性名称的冲突。它通过给元素和属性添加命名空间前缀来实现。例如,<ns:person ns:age="25">John</ns:person> 中的 “ns” 是命名空间前缀。

5. 注释(Comments)

注释用于在 XML 中添加注释信息,以提供更多的说明和解释。注释以 <!-- 开始,以 --> 结束。

6. CDATA(Character Data)

CDATA 用于在 XML 中包含特殊字符,如 <>,而不被解析器解释为标签。CDATA 部分以 <![CDATA[ 开始,以 ]]> 结束。

二、 XML操作(版本1)

1. 创建XML文档

使用XmlDocument类来创建一个新的XML文档,并添加元素、属性和文本等内容。

XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("Root");
doc.AppendChild(root);

2. 加载和解析XML文档

可以使用XmlDocument或XmlReader类来加载和解析XML文档

XmlDocument doc = new XmlDocument();
doc.Load("path/to/xml/file.xml");XmlReader reader = XmlReader.Create("path/to/xml/file.xml");
while (reader.Read())
{// 处理XML数据
}

3. 查询和筛选XML数据

// 使用XPath查询
XmlNodeList nodes = doc.SelectNodes("//Book[Price > 10]");// 使用LINQ to XML查询
var books = from book in doc.Descendants("Book")where (int)book.Element("Price") > 10select book;

4. 修改和更新XML数据

可以通过修改XmlDocument对象的属性和元素来更新XML数据

XmlElement bookElement = doc.CreateElement("Book");
XmlAttribute titleAttribute = doc.CreateAttribute("Title");
titleAttribute.Value = "C# Programming";
bookElement.Attributes.Append(titleAttribute);XmlElement priceElement = doc.CreateElement("Price");
priceElement.InnerText = "20";
bookElement.AppendChild(priceElement);XmlNode root = doc.DocumentElement;
root.AppendChild(bookElement);// 保存修改后的XML文档
doc.Save("path/to/xml/file.xml");

二、 XML操作(版本2)

1. 创建XML

/// <summary>
/// 创建XML文件
/// </summary>
/// <param name="xmlPath"></param>
private static void CreateXmlFile(string xmlPath)
{try{//定义一个XDocument结构XDocument myXDoc = new XDocument(new XElement("Users",new XElement("User", new XAttribute("ID", "111111"),new XElement("name", "EricSun"),new XElement("password", "123456"),new XElement("description", "Hello I'm from Dalian")),new XElement("User", new XAttribute("ID", "222222"),new XElement("name", "Ray"),new XElement("password", "654321"),new XElement("description", "Hello I'm from Jilin"))));//保存此结构(即:我们预期的xml文件)myXDoc.Save(xmlPath);string aa = myXDoc.ToString();}catch (Exception ex){Console.WriteLine(ex.ToString());}
}

2. 查询和筛选XML数据

获得根节点下name子节点

/// <summary>
/// 遍历xml信息
/// </summary>
/// <param name="xmlPath"></param>
private static void GetXmlNodeInformation(string xmlPath)
{try{//定义并从xml文件中加载节点(根节点)XElement rootNode = XElement.Load(xmlPath);//XElement rootNode2 = XElement.Parse(xmlPath);//查询语句: 获得根节点下name子节点(此时的子节点可以跨层次:孙节点、重孙节点......)IEnumerable<XElement> targetNodes = from target in rootNode.Descendants("name")select target;foreach (XElement node in targetNodes){Console.WriteLine("name = {0}", node.Value);}}catch (Exception ex){Console.WriteLine(ex.ToString());}
}

获取ID属性值等于"111111"并且函数子节点的所有User节点

/// <summary>
/// 遍历xml信息
/// </summary>
/// <param name="xmlPath"></param>
private static void GetXmlNodeInformation(string xmlPath)
{try{//定义并从xml文件中加载节点(根节点)XElement rootNode = XElement.Load(xmlPath);//XElement rootNode2 = XElement.Parse(xmlPath);//查询语句: 获取ID属性值等于"111111"并且函数子节点的所有User节点(并列条件用"&&"符号连接)IEnumerable<XElement> myTargetNodes = from myTarget in rootNode.Descendants("User")where myTarget.Attribute("ID").Value.Equals("111111")&& myTarget.HasElementsselect myTarget;foreach (XElement node in myTargetNodes){Console.WriteLine("name = {0}", node.Element("name").Value);Console.WriteLine("password = {0}", node.Element("password").Value);Console.WriteLine("description = {0}", node.Element("description").Value);}}catch (Exception ex){Console.WriteLine(ex.ToString());}
}

3. 修改和更新XML数据

/// <summary>
/// 修改xml信息
/// </summary>
/// <param name="xmlPath"></param>
public static void ModifyXmlNodeInformation(string xmlPath)
{try{//定义并从xml文件中加载节点(根节点)XElement rootNode = XElement.Load(xmlPath);//查询语句: 获取ID属性值等于"222222"或者等于"777777"的所有User节点(或条件用"||"符号连接)IEnumerable<XElement> targetNodes = from target in rootNode.Descendants("User")where target.Attribute("ID").Value == "222222"|| target.Attribute("ID").Value.Equals("777777")select target;//遍历所获得的目标节点(集合)foreach (XElement node in targetNodes){//将description节点的InnerText设置为"Hello, I'm from USA."node.Element("description").SetValue("Hello, I'm from USA.");}//保存对xml的更改操作rootNode.Save(xmlPath);}catch (Exception ex){Console.WriteLine(ex.ToString());}
}

4. 添加xml信息

/// <summary>
/// 添加xml信息
/// </summary>
/// <param name="xmlPath"></param>
private static void AddXmlNodeInformation(string xmlPath)
{try{//定义并从xml文件中加载节点(根节点)XElement rootNode = XElement.Load(xmlPath);//定义一个新节点XElement newNode = new XElement("User", new XAttribute("ID", "999999"),new XElement("name", "Rose"),new XElement("password", "456123"),new XElement("description", "Hello, I'm from UK."));//将此新节点添加到根节点下rootNode.Add(newNode);//Add 在 XContainer 的子内容的末尾添加内容。//AddFirst 在 XContainer 的子内容的开头添加内容。//AddAfterSelf 在 XNode 后面添加内容。//AddBeforeSelf 在 XNode 前面添加内容。//保存对xml的更改操作rootNode.Save(xmlPath);}catch (Exception ex){Console.WriteLine(ex.ToString());}
}

5. 删除xml信息

/// <summary>
/// 删除xml信息
/// </summary>
/// <param name="xmlPath"></param>
private static void DeleteXmlNodeInformation(string xmlPath)
{try{//定义并从xml文件中加载节点(根节点)XElement rootNode = XElement.Load(xmlPath);//查询语句: 获取ID属性值等于"999999"的所有User节点IEnumerable<XElement> targetNodes = from target in rootNode.Descendants("User")where target.Attribute("ID").Value.Equals("999999")select target;//将获得的节点集合中的每一个节点依次从它相应的父节点中删除targetNodes.Remove();//保存对xml的更改操作rootNode.Save(xmlPath);}catch (Exception ex){Console.WriteLine(ex.ToString());}
}

四、XML与实体之间的转换

1. 实体转化为XML

/// <summary>   
/// 实体转化为XML   
/// </summary>   
public static string ParseToXml<T>(this T model, string fatherNodeName)
{var xmldoc = new XmlDocument();var modelNode = xmldoc.CreateElement(fatherNodeName);xmldoc.AppendChild(modelNode);if (model != null){foreach (PropertyInfo property in model.GetType().GetProperties()){var attribute = xmldoc.CreateElement(property.Name);if (property.GetValue(model, null) != null)attribute.InnerText = property.GetValue(model, null).ToString();//else//    attribute.InnerText = "[Null]";modelNode.AppendChild(attribute);}}return xmldoc.OuterXml;
}

2. XML转换为实体,默认 fatherNodeName=“body”

/// <summary>
/// XML转换为实体,默认 fatherNodeName="body"
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="xml"></param>
/// <param name="fatherNodeName"></param>
/// <returns></returns>
public static T ParseToModel<T>(this string xml, string fatherNodeName = "body") where T : class ,new()
{if (string.IsNullOrEmpty(xml))return default(T);var xmldoc = new XmlDocument();xmldoc.LoadXml(xml);T model = new T();var attributes = xmldoc.SelectSingleNode(fatherNodeName).ChildNodes;foreach (XmlNode node in attributes){foreach (var property in model.GetType().GetProperties().Where(property => node.Name == property.Name)){if (!string.IsNullOrEmpty(node.InnerText)){property.SetValue(model,property.PropertyType == typeof(Guid)? new Guid(node.InnerText): Convert.ChangeType(node.InnerText, property.PropertyType));}else{property.SetValue(model, null);}}}return model;
}

3. XML转实体

/// <summary>
/// XML转实体
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="xml"></param>
/// <param name="headtag"></param>
/// <returns></returns>
public static List<T> XmlToObjList<T>(this string xml, string headtag) where T : new()
{var list = new List<T>();XmlDocument doc = new XmlDocument();PropertyInfo[] propinfos = null;doc.LoadXml(xml);XmlNodeList nodelist = doc.SelectNodes(headtag);foreach (XmlNode node in nodelist){T entity = new T();if (propinfos == null){Type objtype = entity.GetType();propinfos = objtype.GetProperties();}foreach (PropertyInfo propinfo in propinfos){//实体类字段首字母变成小写的  string name = propinfo.Name.Substring(0, 1) + propinfo.Name.Substring(1, propinfo.Name.Length - 1);XmlNode cnode = node.SelectSingleNode(name);string v = cnode.InnerText;if (v != null)propinfo.SetValue(entity, Convert.ChangeType(v, propinfo.PropertyType), null);}list.Add(entity);}return list;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第31天| 455.分发饼干 376. 摆动序列 53. 最大子序和

今日学习的文章链接&#xff0c;或者视频链接 第八章 贪心算法 part01 自己看到题目的第一想法 看完代码随想录之后的想法 455: class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(),g.end());sort(s.…

7D透明屏的市场应用广泛,在智能家居中有哪些应用表现?

7D透明屏是一种新型的显示技术&#xff0c;它能够实现透明度高达70%以上的显示效果。这种屏幕可以应用于各种领域&#xff0c;如商业广告、展览展示、智能家居等&#xff0c;具有广阔的市场前景。 7D透明屏的工作原理是利用光学投影技术&#xff0c;将图像通过透明屏幕投射出来…

Talk | 南洋理工大学博士后研究员李祥泰:基于Transformer的视觉分割模型总结、回顾与展望

​ 本期为TechBeat人工智能社区第517期线上Talk&#xff01; 北京时间7月27日(周四)20:00&#xff0c;南洋理工大学博士后研究员—李祥泰的Talk已经准时在TechBeat人工智能社区开播了&#xff01; 他与大家分享的主题是: “基于Transformer的视觉分割模型总结、回顾与展望”&am…

C#多线程

C#多线程 C#多线程是C#学习中必不可少的知识&#xff0c;在实际开发中也能有效的提升用户体验&#xff0c;和程序性能。 文章目录 C#多线程前言一、什么是线程、什么是进程、什么是协程&#xff1f;协程优点缺点 线程优点缺点&#xff1a; 进程优点缺点&#xff1a; 二、C# 中…

使用Spring Boot实现Redis键过期回调功能

使用Spring Boot实现Redis键过期回调功能 当使用Redis作为缓存或数据存储的时候&#xff0c;有时候需要在键过期时执行一些特定的操作&#xff0c;比如清除相关数据或发送通知。在Spring Boot中&#xff0c;可以通过实现RedisMessageListener接口来实现Redis键过期回调功能。下…

基于“RWEQ+”集成技术在土壤风蚀模拟与风蚀模数估算、变化归因分析中的实践应用及SCI论文撰写

查看原文>>>基于“RWEQ”集成技术在土壤风蚀模拟与风蚀模数估算、变化归因分析中的实践应用及SCI论文撰写 土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一&#xff0c;土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的首要过程。…

B2B企业如何选择CRM系统?

CRM软件的优势在于简化业务流程&#xff0c;实现企业的降本增效。越来越多的B2B企业通过CRM为业务赋能&#xff0c;B2B企业如何快速找到适合公司业务的CRM系统&#xff1f;总的来说就是根据企业自身业务而量身打造的一套系统。 1.整理业务需求 B2B企业首先要考虑是业务痛点&a…

MySQL绿色安装和配置

1、 从地址http://dev.mysql.com/downloads/mysql/中选择windows的版本下载。 2、 mysql各个版本的简介 &#xff08;1&#xff09; MySQL Community Server 社区版本&#xff0c;开源免费&#xff0c;但不提供官方技术支持。 &#xff08;2&#xff09; MySQL Enterprise Ed…

Spring MVC

一、什么是MVC MVC就是一种思想&#xff0c;而Spring MVC是对MVC思想的具体实现 MVC是Model View Controller的所缩写&#xff0c;是一种软件架构模式&#xff0c;它将软件系统Fenwick墨香&#xff0c;视图和控制器三个基本部分。 Model&#xff1a;是应用程序中用于处理应用…

对各种项目梳理Maven、SpringBoot等介绍

对于maven 项目 首先结束pom.xm依赖库 https://www.cnblogs.com/zhangweizhong/p/13582903.html plugin插件 maven项目中pom.xml的build中的plugin你真的了解过吗&#xff1f;都是干货_pom 中plugin_is me monday的博客-CSDN博客

7.27 Qt

制作简易小闹钟 Timer.pro QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # dep…

网站SEO优化:提升搜索排名与流量引爆

导言&#xff1a; 在互联网时代&#xff0c;网站SEO&#xff08;搜索引擎优化&#xff09;是提高网站搜索排名、吸引流量、增加曝光的重要策略。通过优化网站结构、内容和链接等方面&#xff0c;让搜索引擎更好地理解和收录网站内容&#xff0c;从而为网站带来更多有价值的有机…

Cisco 路由器配置管理

大多数网络中断的最常见原因是错误的配置更改。对网络设备配置的每一次更改都伴随着造成网络中断、安全问题甚至性能下降的风险。计划外更改使网络容易受到意外中断的影响。 Network Configuration Manager 网络更改和配置管理 &#xff08;NCCM&#xff09;解决方案&#xff…

「JVM」性能调优工具

「JVM」性能调优工具 一、jcmd1、jcmd 能干嘛&#xff1f;2、与JVM相关的命令3、示例 二、jmap1、jmap有什么用&#xff1f;2、jmap的命令大全3、示例 三、jps1、jps有什么用&#xff1f;2、jps命令以及示例 四、jstat1、jstat有什么用&#xff1f;2、jstat命令以及示例 五、js…

Python(四十五)二层循环中的break和continue

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

剑指Offer-学习计划(四)双指针(下)

剑指 Offer 57. 和为s的两个数字 剑指 Offer 58 - I. 翻转单词顺序 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 题目一&#xff1a;调整数组顺序使奇数位于偶数前面 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有奇数在数组的…

WPF实战学习笔记08-创建数据库

创建数据库 创建文件夹 ./Context 创建文件 ./Context/BaseEnity.cs ./Context/Memo.cs ./Context/MyTodoContext.cs ./Context/Todo.cs ./Context/User.cs 创建数据对象 ./Context/BaseEnity.cs namespace MyToDo.Api.Context {public class BaseEnity{public int Id…

C#之泛型

目录 一、概述 二、C#中的泛型 继续栈的示例 三、泛型类 &#xff08;一&#xff09;声明泛型类 &#xff08;二&#xff09;创建构造类型 &#xff08;三&#xff09;创建变量和实例 &#xff08;四&#xff09;比较泛型和非泛型栈 四、类型参数的约束 &#xff08;一…

elementUI --- el-select 下拉框 日历 级联选择

element UI 组件库中的 select 选择器 中下拉列表的样式&#xff0c;在页面渲染的时候&#xff0c;总是渲染为仅次于body级别的div &#xff0c;这样子覆盖样子会影响全局其他的select选择器下拉框样式&#xff0c;试图通过给el-select加父标签来覆盖&#xff0c;然而并没有卵用…

【FAQ】关于无法判断和区分用户与地图交互手势类型的解决办法

一&#xff0e; 问题描述 当用户通过缩放手势、平移手势、倾斜手势和旋转手势与地图交互&#xff0c;控制地图移动改变其可见区域时&#xff0c;华为地图SDK没有提供直接获取用户手势类型的API。 二&#xff0e; 解决方案 华为地图SDK的地图相机有提供CameraPosition类&…