C#中通过LINQtoXML加载、创建、保存、遍历XML和修改XML树

目录

一、加载、创建、保存、遍历XML

1.加载XML

(1)从已有文件加载XML

(2)从字符串加载XML

2.创建并保存XML

3.遍历XML

4.示例源码 

5.运行 

二、修改XML的树

1.添加节点

2.删除

3.更新

4.示例源码

5.运行效果

三、修改XML属性

1.添加

2.检索

3.删除

4.示例源码

5.运行效果


        LINQtoXML编程包含:加载xml、创建全新xml、遍历xml和修改 xml树 的信息。

一、加载、创建、保存、遍历XML

1.加载XML

(1)从已有文件加载XML

        使用LINQtoXML 加载 xml 可以从多种数据源获得,例如字符串、 XmlReader 、 TextReader 或文件。
        从已有文件中加载xml 是最常见的xml文件操作。

(2)从字符串加载XML

        也可以使用 Parse()  方法从一个字符串加载 xml。

2.创建并保存XML

        调用XElement 对象的构造函数可以创建 xml 文档。
        使用 LINQtoXML 也可以 创建 xml 文档。

3.遍历XML

        使用 LINQtoXML 在 xml 树中遍历 xml 是相当简单的。只需要使用 XElement 和 XAttribute 类中的方法。Elements 和 Element 方法提供了定位到某个或某些元素的方式。 

4.示例源码 

         .NET 7.控制台应用,需要NuGet相关的程序包,其安装方法详见作者此前发布的文章。

// LINQ to XML 编程:加载 xml、创建全新 xml、保存xml
using System.IO;
using System.Xml.Linq;namespace _10_3
{class Program{static void Main(string[] args){//加载已有XMLLoadFromFile();Console.WriteLine("------------------------------------------------------------");LoadFromString();Console.WriteLine("------------------------------------------------------------");//创建全新XMLCreateXml();Console.WriteLine("------------------------------------------------------------");//遍历XMLEnumXml();Console.WriteLine("------------------------------------------------------------");}#region 从文件加载/// <summary>/// Load()方法从文件加载XML/// path文件路径/// </summary>static void LoadFromFile(){string path = Directory.GetCurrentDirectory() + @"\LoadFromFile.xml";XElement root = XElement.Load(path);Console.WriteLine(root.ToString());}#endregion 从文件加载#region 从string()加载并存储/// <summary>/// Parse()方法从描述XML文件的一系列字符串加载/// Save()存储XML文件/// </summary>static void LoadFromString(){string path = Directory.GetCurrentDirectory() + @"\LoadFromStr.xml";XElement root = XElement.Parse(@"<db_CSharp><tb_Employee><ID>YGBH0001</ID><Name>小王</Name><db_CSharp><tb_Salary><Salary>1500</Salary></tb_Salary></db_CSharp></tb_Employee><tb_Employee><ID>YGBH0002</ID><Name>小李</Name><db_CSharp>               <tb_Salary><Salary>3000</Salary></tb_Salary>               </db_CSharp></tb_Employee><tb_Employee><ID>YGBH0003</ID><Name>小刘留</Name><db_CSharp>                <tb_Salary><Salary>5000</Salary></tb_Salary></db_CSharp></tb_Employee></db_CSharp>");Console.WriteLine(root.ToString());root.Save(path);}#endregion 从string()加载并存储#region 创建并存储XML/// <summary>/// XElement()方法创建记录和元素/// </summary>static void CreateXml(){string path = Directory.GetCurrentDirectory() + @"\CreateXml.xml";XElement root = new("Categories",new XElement("Category",new XElement("CategoryID", Guid.NewGuid()),new XElement("CategoryName", "食品"),new XElement("Description", "可以吃的东西")));Console.WriteLine(root.ToString());root.Save(path);}#endregion 创建并存储XML#region 遍历XML/// <summary>/// 如何遍历 xml 树,并获取指定元素/// 遍历永远离不开foreach()的/// </summary>static void EnumXml(){string path = Directory.GetCurrentDirectory() + @"\EnumXml.xml";string strCon = "Data Source=DESKTOP-3LV13FS;Integrated Security=True;Database=db_CSharp;";DataClasses1DataContext? _Linq;_Linq = new DataClasses1DataContext(strCon);XElement root = new("tb_Employee");root.Add(_Linq.tb_Employee.Select(c => new XElement("ID",new XElement("Name", c.Name))));foreach (XElement? item in root.Elements("ID")){if (item != null){Console.WriteLine(item.Element("Name")!.Value); //“!”解除CS8602,关闭编译器空检查}}root.Save(path);}#endregion 遍历XML}
}

5.运行 

<db_CSharp><tb_Employee><ID>YGBH0001</ID><Name>小王</Name><db_CSharp><tb_Salary><Salary>1500</Salary></tb_Salary><tb_Salary><Salary>3000</Salary></tb_Salary><tb_Salary><Salary>5000</Salary></tb_Salary></db_CSharp></tb_Employee><tb_Employee><ID>YGBH0002</ID><Name>小李</Name><db_CSharp><tb_Salary><Salary>1500</Salary></tb_Salary><tb_Salary><Salary>3000</Salary></tb_Salary><tb_Salary><Salary>5000</Salary></tb_Salary></db_CSharp></tb_Employee><tb_Employee><ID>YGBH0003</ID><Name>小刘留</Name><db_CSharp><tb_Salary><Salary>1500</Salary></tb_Salary><tb_Salary><Salary>3000</Salary></tb_Salary><tb_Salary><Salary>5000</Salary></tb_Salary></db_CSharp></tb_Employee>
</db_CSharp>
------------------------------------------------------------
<db_CSharp><tb_Employee><ID>YGBH0001</ID><Name>小王</Name><db_CSharp><tb_Salary><Salary>1500</Salary></tb_Salary></db_CSharp></tb_Employee><tb_Employee><ID>YGBH0002</ID><Name>小李</Name><db_CSharp><tb_Salary><Salary>3000</Salary></tb_Salary></db_CSharp></tb_Employee><tb_Employee><ID>YGBH0003</ID><Name>小刘留</Name><db_CSharp><tb_Salary><Salary>5000</Salary></tb_Salary></db_CSharp></tb_Employee>
</db_CSharp>
------------------------------------------------------------
<Categories><Category><CategoryID>71b53e44-9e1b-43ce-b848-501b66e6493f</CategoryID><CategoryName>食品</CategoryName><Description>可以吃的东西</Description></Category>
</Categories>
------------------------------------------------------------
小王
小李
小刘留
小科
小亮
章子怡
汪峰
------------------------------------------------------------

二、修改XML的树

        LINQtoXML 一个重要的特性是能够方便地修改 xml 树,如 添加、删除、更新 xml 文档的内容。

1.添加节点

        使用 XNode 类的插入方法可以方便地向 xml 树添加内容。
方法说明
AddAfterSelf紧跟在此节点之后添加指定的内容
AddBeforeSelf紧邻此节点之前添加指定的内容

2.删除

        使用 Remove(XElement)方法来删除元素 ,使用  RemoveAll 方法来删除 xml 。

3.更新

        在 LINQtoXML 中更新xml内容可以使用以下几种方法:                
方法说明
ReplaceWith用指定的内容来取代当前元素的内容
ReplaceAll用指定的内容来取代当前元素的子节点及相关的属性
ReplaceNodes用指定的内容来取代文档或当前元素的子节点
SetAttributeValue设置属性的值、添加属性或移除属性
SetElementValue设置子元素的值、添加子元素或移除子元素

4.示例源码

        .NET 7.0控制台应用程序。

// LINQtoXML 修改xml树:添加、删除、更新xml文档的内容。
using System.IO;
using System.Xml.Linq;namespace _10_4
{class Program{#region 在此节点之后添加/// <summary>/// 在此节点之后添加/// </summary>static void AddAfterSelf(){string path = Directory.GetCurrentDirectory() + @"\AddAfterSelf.xml";XElement? root = XElement.Parse(@"<Categories><Category><CategoryID>1</CategoryID><CategoryName>Beverages</CategoryName><Description>Soft drinks, coffees, teas, beers, and ales</Description></Category></Categories>");XElement xele = root.Element("Category")!.Element("CategoryName")!;  //!编译器禁止做null判断xele.AddAfterSelf(new XElement("AddDate", DateTime.Now));Console.WriteLine(root.ToString());root.Save(path);           }#endregion 在此节点之后添加#region 在 LINQtoXML中更新xml/// <summary>/// 更新xml/// 使用了ReplaceWith与SetElementValue方法更新xml/// </summary>static void Update(){string path = Directory.GetCurrentDirectory() + @"\Update.xml";XElement? root = XElement.Parse(@"<Categories><Category><CategoryID>1</CategoryID><CategoryName>Beverages</CategoryName><Description>Soft drinks, coffees, teas, beers, and ales</Description></Category></Categories>");root.Element("Category")!.Element("CategoryID")!.ReplaceWith(new XElement("ID", "2"));   //修改<CategoryID>1</CategoryID>→<ID>1<ID>root.Element("Category")!.SetElementValue("CategoryName", "test data");                         //修改Beverages→test dataConsole.WriteLine(root.ToString());root.Save(path);}#endregion 在 LINQtoXML中更新xml#region 删除 xml/// <summary>/// /// </summary>static void RemoveAll(){string path = Directory.GetCurrentDirectory() + @"\RemoveAll.xml";XElement root = XElement.Parse(@"<Categories><Category><CategoryID>1</CategoryID><CategoryName>Beverages</CategoryName><Description>Soft drinks, coffees, teas, beers, and ales</Description></Category></Categories>");root.RemoveAll();Console.WriteLine(root.ToString());root.Save(path);}#endregion 删除 xml#region 删除元素static void Remove(){string path = Directory.GetCurrentDirectory() + @"\Remove.xml";XElement root = XElement.Parse(@"<Categories><Category><CategoryID>1</CategoryID><CategoryName>Beverages</CategoryName><Description>Soft drinks, coffees, teas, beers, and ales</Description></Category></Categories>");root.Element("Category")!.Element("Description")!.Remove(); //删除元素DescriptionConsole.WriteLine(root.ToString());root.Save(path);}#endregion 删除元素static void Main(string[] args){//在此节点之后添加AddAfterSelf();Console.WriteLine("------------------------------------------------------------");//在 LINQtoXML中更新xmlUpdate();Console.WriteLine("------------------------------------------------------------");//删除xmlRemoveAll();Console.WriteLine("------------------------------------------------------------");//删除元素Remove();Console.WriteLine("------------------------------------------------------------");}}
}

5.运行效果

<Categories><Category><CategoryID>1</CategoryID><CategoryName>Beverages</CategoryName><AddDate>2023-11-08T22:11:10.1486749+08:00</AddDate><Description>Soft drinks, coffees, teas, beers, and ales</Description></Category>
</Categories>
------------------------------------------------------------
<Categories><Category><ID>2</ID><CategoryName>test data</CategoryName><Description>Soft drinks, coffees, teas, beers, and ales</Description></Category>
</Categories>
------------------------------------------------------------
<Categories />
------------------------------------------------------------
<Categories><Category><CategoryID>1</CategoryID><CategoryName>Beverages</CategoryName></Category>
</Categories>
------------------------------------------------------------

三、修改XML属性

1.添加

        LINQtoXML添加属性与添加元素是类似的,可以使用构造函数或者 Add() 方法来添加属性。

2.检索

        检索属性可以使用 Attribute(name) 方法查找指定的元素。

3.删除

        调用 XAttribute 对象的 Remove 方法来完成删除属性的操作。

4.示例源码

// LINQtoXML添加属性、检索属性和删除属性
using System.IO;
using System.Xml.Linq;namespace _10_5
{class Program{#region 添加属性static void AddAttribute(){string path = Directory.GetCurrentDirectory() + @"\AddAttribute.xml";XElement root = new("Categories",new XElement("Category",new XAttribute("CategoryID", "1"),new XElement("CategoryName", "Beverages"),new XElement("Description", "Soft drinks, coffees, teas, beers, and ales")));root.Element("Category")!.Add(new XAttribute("AddDate", DateTime.Now.ToShortDateString())); //添加属性Console.WriteLine(root);root.Save(path);}#endregion 添加属性#region 检索属性static void SelectAttribute(){XElement root = new("Categories",new XElement("Category",new XAttribute("CategoryID", "1"),new XElement("CategoryName", "Beverages"),new XElement("Description", "Soft drinks, coffees, teas, beers, and ales")));XAttribute xattr = root.Element("Category")!.Attribute("CategoryID")!;  //检索指定元素Console.WriteLine(xattr.Name);Console.WriteLine(xattr.Value);}#endregion 检索属性#region 删除属性static void Remove(){string path = Directory.GetCurrentDirectory() + @"\RemoveAttri.xml";XElement root = new("Categories",new XElement("Category",new XAttribute("CategoryID", "1"),new XElement("CategoryName", "Beverages"),new XElement("Description", "Soft drinks, coffees, teas, beers, and ales")));root.Element("Category")!.Attribute("CategoryID")!.Remove(); //删除属性CategoryIDConsole.WriteLine(root.ToString());root.Save(path);}#endregion 删除属性static void Main(string[] args){//添加属性AddAttribute();Console.WriteLine("------------------------------------------------------------");//检索属性SelectAttribute();Console.WriteLine("------------------------------------------------------------");//删除属性Remove();Console.WriteLine("------------------------------------------------------------");}}
}

5.运行效果

<Categories><Category CategoryID="1" AddDate="2023-11-08"><CategoryName>Beverages</CategoryName><Description>Soft drinks, coffees, teas, beers, and ales</Description></Category>
</Categories>
------------------------------------------------------------
CategoryID
1
------------------------------------------------------------
<Categories><Category><CategoryName>Beverages</CategoryName><Description>Soft drinks, coffees, teas, beers, and ales</Description></Category>
</Categories>
------------------------------------------------------------

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

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

相关文章

Linux 学习(CentOS 7)

CentOS 7 学习 Linux系统内核作者: Linux内核版本 内核(kernel)是系统的心脏&#xff0c;是运行程序和管理像磁盘和打印机等硬件设备的核心程序&#xff0c;它提供了一个在裸设备与应用程序间的抽象层。 Linux内核版本又分为稳定版和开发版&#xff0c;两种版本是相互关联&am…

【小白专用】VSCode下载和安装与配置PHP开发环境(详细版) 23.11.08

1. 下载VSCode2. 解决VSCode下载速度特别慢3. 安装VSCode 一、VSCode介绍 VSCode 是一款由微软开发且跨平台的免费源代码编辑器&#xff1b;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和 Git 版本控制系统。 二、官方下载地址…

emq系统调优支持更大并发

emq系统调优支持更大并发 Linux 操作系统参数 系统全局允许分配的最大文件句柄数: # 2 millions system-wide sysctl -w fs.file-max2097152 sysctl -w fs.nr_open2097152 echo 2097152 > /proc/sys/fs/nr_open允许当前会话 / 进程打开文件句柄数: ulimit -n 1048576/et…

Oauth2.0概念和案例代码

OAuth 2.0&#xff08;开放授权&#xff09;是一种常用的授权机制&#xff0c;用于让用户授权第三方应用访问他们的数据而无需分享密码。OAuth 2.0 是OAuth 1.0的升级版&#xff0c;提供了更多的授权类型和流程。 OAuth 2.0 包含三个角色&#xff1a; 第三方应用&#xff1a;…

Ubuntu下启动Apache对.htaccess 的支持步骤, 利用.htaccess绑定域名到子目录

Ubuntu下启动Apache对.htaccess 的支持步骤 1. 终端运行 sudo a2enmod 程序提示可供激活的模块名称&#xff0c;输入&#xff1a; rewrite 2. 修改/etc/apache2/sites-enabled/000-default (该链接指向的是站点配置文件) 把&#xff08;默认的www目录、或者需要应用.htacc…

网络带宽基础知识简单介绍

网络带宽基础知识简单介绍 前言一、网络带宽是什么&#xff1f;二、影响网络带宽的因素三、网络带宽的单位总结 前言 最近一些需求涉及到了网络带宽&#xff0c;整理后有了本文 一、网络带宽是什么&#xff1f; 网络带宽是指在单位时间内&#xff08;一般指的是1秒钟&#xf…

django+drf+vue 简单系统搭建 (1) - django创建项目

本系列文章为了记录自己第一个系统生成过程&#xff0c;主要使用django,drf,vue。本人非专业人士&#xff0c;此文只为记录学习&#xff0c;若有部分描述不够准确的地方&#xff0c;烦请指正。 建立这个系统的原因是因为&#xff0c;在生活中&#xff0c;很多觉得可以一两行代码…

Flutter的专属Skia引擎解析+用法原理

Skia是一款跨平台的2D图形库&#xff0c;是Google公司开发的&#xff0c;可以用于开发各种应用程序&#xff0c;如浏览器、游戏、移动应用程序等。Skia引擎的主要特点是速度快、可移植性强、占用的内存少、稳定性佳&#xff0c;适用于多种硬件平台。 Skia的目标是提供快速、高…

基于GCC的工具objdump实现反汇编

一&#xff1a;objdump介绍 在 Linux中&#xff0c;一切皆文件。 Linux 编程实际上是编写处理各种文件的代码。系统由许多类型的文件组成&#xff0c;但目标文件具有一种特殊的设计&#xff0c;提供了灵活和多样的用途。 目标文件是包含带有附加地址和值的助记符号的路线图。这…

standard_init_linux.go:211: exec user process caused “exec format error“

在使用docker搭建hue的过程中出现了如下错误: standard_init_linux.go:211: exec user process caused "exec format error"docker日志 [roots14 bin]# docker logs fa5b1c4e0614 standard_init_linux.go:211: exec user process caused "exec format error&q…

kubernetes集群编排(7)

目录 k8s认证授权 pod绑定sa 认证 授权 k8s认证授权 pod绑定sa [rootk8s2 ~]# kubectl create sa admin //在当前 Kubernetes 集群中创建一个名为 "admin" 的新服务账户[rootk8s2 secret]# vim pod3.yaml apiVersion: v1 kind: Pod metadata:name: mypod spec…

人工智能在现代科技中的应用和未来发展趋势

人工智能&#xff08;AI&#xff09;是一门包括机器学习、自然语言处理、视觉识别等技术的领域&#xff0c;它已经广泛应用于现代科技中&#xff0c;并且在未来的发展中将继续扮演至关重要的角色。 以下是人工智能在现代科技中的应用和未来发展趋势的一些例子&#xff1a; 1.…

Axure RP9安装,正版授权,汉化

Axure RP9 Axure RP 9是一种流行且功能强大的原型设计和线框图工具&#xff0c;用于创建网站和应用程序的交互式和动态原型。它是Axure RP&#xff08;Rapid Prototyping&#xff09;软件的第九个主要版本&#xff0c;以其强大的功能集和创建高保真原型的能力而闻名。 Axure …

Paste v4.1.2(Mac剪切板)

Paste for Mac是一款运行在Mac OS平台上的剪切板小工具&#xff0c;拥有华丽的界面效果&#xff0c;剪切板每一条记录可显示&#xff08;预览&#xff09;文本&#xff0c;图片等记录的完整内容&#xff0c;可以记录最近指定条数的剪切板信息&#xff0c;方便用户随时调用&…

软件测试入门之接口测试

首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能给你…

思维模型 首因效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。先入为主&#xff0c;一见钟情。 1 首因效应的应用 1.1 面试中的首因效应 小李是一名应届毕业生&#xff0c;他准备参加一家知名互联网公司的面试。在面试前&#xff0c;他做了充分的准备…

NIO 笔记(一)基础内容

【笔记来自&#xff1a;it白马】 NIO基础 **注意&#xff1a;**推荐完成JavaSE篇、JavaWeb篇的学习再开启这一部分的学习&#xff0c;如果在这之前完成了JVM篇&#xff0c;那么看起来就会比较轻松了。 在JavaSE的学习中&#xff0c;我们了解了如何使用IO进行数据传输&#xf…

使用Plsql+oracle client 连接 Oracle数据库

2011年入职老东家X煤集团的时候&#xff0c;在csnd上写了一篇blog&#xff0c;题目叫“什么是ERP”&#xff0c;从此跳入DBA了这个烂坑&#xff0c;目前公司的数据库一部分是Oracle&#xff0c;另一部分是MySQL的&#xff0c;少量MSSQL&#xff0c;还需要捡起来一部分&#xff…

2311d游戏引擎适配ios

原文 通过遵循arsd:simpledisplay(v11.0.0之前)上的一些旧代码,Apple的文档和Jacob的这一惊人贡献桥, 我已从金属绑定中删除了所有extern(Objective-C)代码,现在,所有Objective-C桥接代码都是使用D的反射生成的. 因此,给定此例代码: import core.attribute : selector; extern…

【JAVA学习笔记】65 - 文件类,IO流--节点流、处理流、对象流、转换流、打印流

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter19/src/com/yinhai 文件 一、文件&#xff0c;流 文件,对我们并不陌生&#xff0c;文件是保存数据的地方,比如大家经常使用的word文档,txt文件,excel文件..都是文件。它既可以保存一张图片…