C#操作XML方法集合

C#操作XML方法集合先来了解下操作XML所涉及到的几个类及之间的关系如果大家发现少写了一些常用的方法,麻烦在评论中指出,我一定会补上的!谢谢大家*1XMLElement主要是针对节点的一些属性进行操作

大家好,又见面了,我是你们的朋友全栈君。

 

一 前言

先来了解下操作XML所涉及到的几个类及之间的关系  如果大家发现少写了一些常用的方法,麻烦在评论中指出,我一定会补上的!谢谢大家

* 1 XMLElement 主要是针对节点的一些属性进行操作
* 2 XMLDocument 主要是针对节点的CUID操作
* 3 XMLNode 为抽象类,做为以上两类的基类,提供一些操作节点的方法

 

 

<span role="heading" aria-level="2">C#操作XML方法集合

清楚了以上的关系在操作XML时会更清晰一点

 

二 具体操作(C#)

  以下会对Xml的结点与属性做增 删 改 查的操作也满足了实际工作中的大部分情况 

先构造一棵XML树如下,其中也涉及到了写入xml文档的操作

 

 1 public void CreatXmlTree(string xmlPath)  2  {  3 XElement xElement = new XElement(  4 new XElement("BookStore",  5 new XElement("Book",  6 new XElement("Name", "C#入门", new XAttribute("BookName", "C#")),  7 new XElement("Author", "Martin", new XAttribute("Name", "Martin")),  8 new XElement("Adress", "上海"),  9 new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd")) 10  ), 11 new XElement("Book", 12 new XElement("Name", "WCF入门", new XAttribute("BookName", "WCF")), 13 new XElement("Author", "Mary", new XAttribute("Name", "Mary")), 14 new XElement("Adress", "北京"), 15 new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd")) 16  ) 17  ) 18  ); 19 20 //需要指定编码格式,否则在读取时会抛:根级别上的数据无效。 第 1 行 位置 1异常 21 XmlWriterSettings settings = new XmlWriterSettings(); 22 settings.Encoding = new UTF8Encoding(false); 23 settings.Indent = true; 24 XmlWriter xw = XmlWriter.Create(xmlPath,settings); 25  xElement.Save(xw); 26 //写入文件 27  xw.Flush(); 28  xw.Close(); 29 }

 

然后得到如下的XML树

 1 <?xml version="1.0" encoding="utf-8"?>  2 <BookStore>  3 <Book>  4 <Name BookName="C#">C#入门</Name>  5 <Author Name="Martin">Martin</Author>  6 <Date>2013-10-11</Date>  7 <Adress>上海</Adress>  8 <Date>2013-10-11</Date>  9 </Book> 10 <Book> 11 <Name BookName="WCF">WCF入门</Name> 12 <Author Name="Mary">Mary</Author> 13 <Adress>北京</Adress> 14 <Date>2013-10-11</Date> 15 </Book> 16 </BookStore>

 

以下操作都是对生成的XML树进行操作

2.1 新增节点与属性

新增节点NewBook并增加属性Name=”WPF”

 1 public void Create(string xmlPath)  2  {  3 XmlDocument xmlDoc = new XmlDocument();  4  xmlDoc.Load(xmlPath);  5  6 var root = xmlDoc.DocumentElement;//取到根结点  7 XmlNode newNode = xmlDoc.CreateNode("element", "NewBook", "");  8 newNode.InnerText = "WPF";  9 10 //添加为根元素的第一层子结点 11  root.AppendChild(newNode); 12  xmlDoc.Save(xmlPath); 13 }

 

 开篇有写操作xml节点属性主要用XmlElement对象所以取到结点后要转类型 

 1 //属性  2 public void CreateAttribute(string xmlPath)  3  {  4 XmlDocument xmlDoc = new XmlDocument();  5  xmlDoc.Load(xmlPath);  6 var root = xmlDoc.DocumentElement;//取到根结点  7 XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");  8 node.SetAttribute("Name", "WPF");  9  xmlDoc.Save(xmlPath); 10 11 }

 

 效果如下

<span role="heading" aria-level="2">C#操作XML方法集合

 

2.2 删除节点与属性

 1 public void Delete(string xmlPath)  2  {  3 XmlDocument xmlDoc = new XmlDocument();  4  xmlDoc.Load(xmlPath);  5 var root = xmlDoc.DocumentElement;//取到根结点  6  7 var element = xmlDoc.SelectSingleNode("BookStore/NewBook");  8  root.RemoveChild(element);  9  xmlDoc.Save(xmlPath); 10 }

删除属性

 1 public void DeleteAttribute(string xmlPath)  2  {  3 XmlDocument xmlDoc = new XmlDocument();  4  xmlDoc.Load(xmlPath);  5 XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");  6 //移除指定属性  7 node.RemoveAttribute("Name");  8 //移除当前节点所有属性,不包括默认属性  9 //node.RemoveAllAttributes(); 10  xmlDoc.Save(xmlPath); 11 }

 

2.3 修改节点与属性

   xml的节点默认是不允许修改的,本文也就不做处理了

  修改属性代码如下

1 public void ModifyAttribute(string xmlPath) 2  { 3 XmlDocument xmlDoc = new XmlDocument(); 4  xmlDoc.Load(xmlPath); 5 XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook"); 6 element.SetAttribute("Name", "Zhang"); 7  xmlDoc.Save(xmlPath); 8 }

效果如下

<span role="heading" aria-level="2">C#操作XML方法集合

2.4 获取节点与属性

 1 public void Select(string xmlPath)  2  {  3 XmlDocument xmlDoc = new XmlDocument();  4  xmlDoc.Load(xmlPath);  5 //取根结点  6 var root = xmlDoc.DocumentElement;//取到根结点  7 //取指定的单个结点  8 XmlNode oldChild = xmlDoc.SelectSingleNode("BookStore/NewBook");  9 10 //取指定的结点的集合 11 XmlNodeList nodes = xmlDoc.SelectNodes("BookStore/NewBook"); 12 13 //取到所有的xml结点 14 XmlNodeList nodelist = xmlDoc.GetElementsByTagName("*"); 15 }

属性

1 public void SelectAttribute(string xmlPath) 2  { 3 XmlDocument xmlDoc = new XmlDocument(); 4  xmlDoc.Load(xmlPath); 5 XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook"); 6 string name = element.GetAttribute("Name"); 7  Console.WriteLine(name); 8 }

 

 

三  具体操作 (linq to XML)

 Linq to Xml 也没什么变化只操作对象改变了主要涉及的几个对象如下   注:我并没有用linq的语法去操作元素

XDocument:用于创建一个XML实例文档

XElement:用于一些节点与节点属性的基本操作

以下是对Xml的 一些简单的操作

3.1 新增节点与属性

1 public void Create(string xmlPath) 2  { 3 XDocument xDoc = XDocument.Load(xmlPath); 4 XElement xElement = xDoc.Element("BookStore"); 5 xElement.Add(new XElement("Test", new XAttribute("Name", "Zery"))); 6  xDoc.Save(xmlPath); 7 }

属性

 1 public void CreateAttribute(string xmlPath)  2  {  3 XDocument xDoc = XDocument.Load(xmlPath);  4 IEnumerable<XElement> xElement = xDoc.Element("BookStore").Elements("Book");  5 foreach (var element in xElement)  6  {  7 element.SetAttributeValue("Name", "Zery");  8  }  9  xDoc.Save(xmlPath); 10 }

 

3.2 删除节点与属性

1 public void Delete(string xmlPath) 2  { 3 XDocument xDoc = XDocument.Load(xmlPath); 4 XElement element = (XElement)xDoc.Element("BookStore").Element("Book"); 5  element.Remove(); 6  xDoc.Save(xmlPath); 7 }

属性

1 public void DeleteAttribute(string xmlPath) 2  { 3 XDocument xDoc = XDocument.Load(xmlPath); 4 //不能跨级取节点 5 XElement element = xDoc.Element("BookStore").Element("Book").Element("Name"); 6 element.Attribute("BookName").Remove(); 7  xDoc.Save(xmlPath); 8 }

3.3 修改节点属性

节点.net没提供修改的方法本文也不做处理

修改属性与新增实质是同一个方法

1 public void ModifyAttribute(string xmlPath) 2  { 3 XDocument xDoc = XDocument.Load(xmlPath); 4 XElement element = xDoc.Element("BookStore").Element("Book"); 5 element.SetAttributeValue("BookName","ZeryTest"); 6  xDoc.Save(xmlPath); 7 }

 

 四 总结

  把文章写完时,又扫去了自己的一个盲区,虽然都是些简单的操作,但在实际的开中,又何尝不是由简单到复杂呢。我觉得身为程序员就应该遇到自己的盲区时,立马花时间去了解,不说要了解多深入,但至少基本的还是要知道,等到工作中真需时,只要稍微花点时间就可以了。

如果觉得文章对你有点帮助,不妨点下推荐,你的推荐让我对写文章能有更多的激情!

成长在于积累!

 

Demo 源码

<span role="heading" aria-level="2">C#操作XML方法集合
<span role="heading" aria-level="2">C#操作XML方法集合

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; using System.Web; using System.Xml.Linq; namespace XMLOperation { class Program { static void Main(string[] args) { /*=============Linq 读写XML==================*/ string wxmlPath = @"F:\XmlTest\test.xml"; XmlWriteReadLinqOperation writeReadLinq = new XmlWriteReadLinqOperation(); // writeReadLinq.WriteXml(wxmlPath);  writeReadLinq.CreatXmlTree(wxmlPath); //string xmlPath = @"F:\XML.xml"; string xmlPath = @"C:\Users\zery.zhang\Desktop\ProjectDemo\XML.xml"; /* * 1 三者之间的关系用图画出 * 2 XMLElement 主要是针对节点的一些属性进行操作 * 3 XMLDocument 主要是针对节点的CUID操作 * 4 XMLNode 为抽象类,做为以上两类的基类,提供一些操作节点的方法 */ //===========C# to Xml==========//  XmlOperation xmlOperation = new XmlOperation(); //xmlOperation.Create(xmlPath); //xmlOperation.CreateAttribute(xmlPath); //xmlOperation.Delete(xmlPath); //xmlOperation.DeleteAttribute(xmlPath); //xmlOperation.Modify(xmlPath); //xmlOperation.ModifyAttribute(xmlPath); //xmlOperation.Select(xmlPath); //xmlOperation.SelectAttribute(xmlPath); /*=============Linq to Xml===========*/ XmlOperationToLinq xOperation = new XmlOperationToLinq(); // xOperation.Create(xmlPath); /* *1 给指定的XML节点的所有子节点增加一个节点,并增加属性 *2 删除指定节点的子节点的指定属性 *3 */ string lxmlPath = @"F:\XmlTest\test.xml"; xOperation.Create(lxmlPath); xOperation.CreateAttribute(lxmlPath); //xperation.Delete(lxmlPath); //xOperation.DeleteAttribute(lxmlPath); // xOperation.ModifyAttribute(lxmlPath); /*=============C# 读写XML===============*/ XmlWriteReadOperation writeRead = new XmlWriteReadOperation(); Console.Read(); } } class XmlOperation { public void Create(string xmlPath) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); var root = xmlDoc.DocumentElement;//取到根结点  XmlNode newNode = xmlDoc.CreateNode("element", "Name", ""); newNode.InnerText = "Zery"; //添加为根元素的第一层子结点  root.AppendChild(newNode); xmlDoc.Save(xmlPath); } //属性 public void CreateAttribute(string xmlPath) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("Collection/Book"); node.SetAttribute("Name", "C#"); xmlDoc.Save(xmlPath); } public void Delete(string xmlPath) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); var root = xmlDoc.DocumentElement;//取到根结点 var element = xmlDoc.SelectSingleNode("Collection/Name"); root.RemoveChild(element); xmlDoc.Save(xmlPath); } public void DeleteAttribute(string xmlPath) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("Collection/Book"); //移除指定属性 node.RemoveAttribute("Name"); //移除当前节点所有属性,不包括默认属性  node.RemoveAllAttributes(); xmlDoc.Save(xmlPath); } public void Modify(string xmlPath) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); var root = xmlDoc.DocumentElement;//取到根结点 XmlNodeList nodeList = xmlDoc.SelectNodes("/Collection/Book"); //xml不能直接更改结点名称,只能复制然后替换,再删除原来的结点 foreach (XmlNode node in nodeList) { var xmlNode = (XmlElement)node; xmlNode.SetAttribute("ISBN", "Zery"); } xmlDoc.Save(xmlPath); } public void ModifyAttribute(string xmlPath) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("Collection/Book"); element.SetAttribute("Name", "Zhang"); xmlDoc.Save(xmlPath); } public void Select(string xmlPath) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); //取根结点 var root = xmlDoc.DocumentElement;//取到根结点 //取指定的单个结点 XmlNode singleNode = xmlDoc.SelectSingleNode("Collection/Book"); //取指定的结点的集合 XmlNodeList nodes = xmlDoc.SelectNodes("Collection/Book"); //取到所有的xml结点 XmlNodeList nodelist = xmlDoc.GetElementsByTagName("*"); } public void SelectAttribute(string xmlPath) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("Collection/Book"); string name = element.GetAttribute("Name"); } } class XmlOperationToLinq { //其它操作 public void OtherOperaton() { //加文件头  } public void Create(string xmlPath) { XDocument xDoc = XDocument.Load(xmlPath); XElement xElement = xDoc.Element("BookStore"); xElement.Add(new XElement("Test", new XAttribute("Name", "Zery"))); xDoc.Save(xmlPath); } public void CreateAttribute(string xmlPath) { XDocument xDoc = XDocument.Load(xmlPath); IEnumerable<XElement> xElement = xDoc.Element("BookStore").Elements("Book"); foreach (var element in xElement) { element.SetAttributeValue("Name", "Zery"); } xDoc.Save(xmlPath); } public void Delete(string xmlPath) { XDocument xDoc = XDocument.Load(xmlPath); XElement element = (XElement)xDoc.Element("BookStore").Element("Book"); element.Remove(); xDoc.Save(xmlPath); } public void DeleteAttribute(string xmlPath) { XDocument xDoc = XDocument.Load(xmlPath); //不能跨级取节点 XElement element = xDoc.Element("BookStore").Element("Book").Element("Name"); element.Attribute("BookName").Remove(); xDoc.Save(xmlPath); } public void ModifyAttribute(string xmlPath) { XDocument xDoc = XDocument.Load(xmlPath); XElement element = xDoc.Element("BookStore").Element("Book"); element.SetAttributeValue("BookName","ZeryTest"); xDoc.Save(xmlPath); } } internal class XmlWriteReadOperation { } class XmlWriteReadLinqOperation { public void CreatXmlTree(string xmlPath) { XElement xElement = new XElement( new XElement("BookStore", new XElement("Book", new XElement("Name", "C#入门", new XAttribute("BookName", "C#")), new XElement("Author", "Martin", new XAttribute("Name", "Martin")), new XElement("Adress", "上海"), new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd")) ), new XElement("Book", new XElement("Name", "WCF入门", new XAttribute("BookName", "WCF")), new XElement("Author", "Mary", new XAttribute("Name", "Mary")), new XElement("Adress", "北京"), new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd")) ) ) ); //需要指定编码格式,否则在读取时会抛:根级别上的数据无效。 第 1 行 位置 1异常 XmlWriterSettings settings = new XmlWriterSettings(); settings.Encoding = new UTF8Encoding(false); settings.Indent = true; XmlWriter xw = XmlWriter.Create(xmlPath,settings); xElement.Save(xw); //写入文件  xw.Flush(); xw.Close(); } public void WriteXml(string xmlPath) { XElement xElement = new XElement( new XElement("Store", new XElement("Book", "技术类", new XElement("Name", "C#入门", new XAttribute("BookName", "C#")), new XElement("Author", "Martin", new XAttribute("Name", "Zery")), new XComment("以下为注释"),//xml注释 new XElement("Date", DateTime.Now.ToString(), new XAttribute("PublicDate", DateTime.Now.ToString())) )) ); XmlWriter xw = XmlWriter.Create(xmlPath); //保存到XmlWriter  xElement.Save(xw); //写入文件  xw.Flush(); xw.Close(); } } }

View Code

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154253.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • TinyProxy电信

    TinyProxy电信listen_port=65080;daemon=on;worker_proc=0;uid=3004;http_ip=112.80.255.21;http_port=443;http_del=“X-Online-Host,Host”;http_first=”[M]http://[H][U][V]\r\nHost:[H]\r\nX-T5-Auth:ZjQxNDIh\r\n”;https_connect=on;https_ip=112.80.255.21;https_port=443

  • ajax的跨域请求_js解决跨域问题

    ajax的跨域请求_js解决跨域问题什么是AJAX?AJAX是无需刷新页面就能够从服务器去的数据的一种方法,负责Ajax运作的核心对象是XMLHttpRequest(XHR)对象。同源策略是对XHR的一个主要约束,它为通信设置了“相同的域、相同的端口、相同的协议”这一限制。试图访问上述限制之外的资源都会引发安全错误,除非采用被认可的跨域解决方案。这个方案叫做CORS(Cross-OriginResourceSharing)跨源…

  • 怎么判断草图完全约束_算法基础课acwing下载

    怎么判断草图完全约束_算法基础课acwing下载爱丽丝和鲍勃正在玩以下游戏。首先,爱丽丝绘制一个 N 个点 M 条边的有向图。然后,鲍勃试图毁掉它。在每一步操作中,鲍勃都可以选取一个点,并将所有射入该点的边移除或者将所有从该点射出的边移除。已知,对于第 i 个点,将所有射入该点的边移除所需的花费为 W+i,将所有从该点射出的边移除所需的花费为 W−i。鲍勃需要将图中的所有边移除,并且还要使花费尽可能少。请帮助鲍勃计算最少花费。输入格式第一行包含 N 和 M。第二行包含 N 个正整数,第 i 个为 W+i。第三行包含 N 个正整数,第.

  • linux复制文件到另一个文件夹并重新命名_linux删除文件夹命令

    linux复制文件到另一个文件夹并重新命名_linux删除文件夹命令1、cp原目标文件路径/文件名目标路径cp/home/test.txt/home/test/test.txt2、cp-R源目录/*目地目录使用-R参数可实现递归功能,即所有子目录中的文件与目录均拷贝作者:哆啦A梦~~来源:CSDN原文:https://blog.csdn.net/sinat_34166518/article/details/83112201…

  • 五大常用算法之二:动态规划算法

    一、基本概念动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略基本

    2021年12月25日
  • Spring中Model、ModelMap、ModelAndView理解和具体使用总结

    Spring中Model、ModelMap、ModelAndView理解和具体使用总结在了解这三者之前,需要知道一点:SpringMVC在调用方法前会创建一个隐含的数据模型,作为模型数据的存储容器,成为”隐含模型”。也就是说在每一次的前后台请求的时候会随带这一个背包,不管你用没有,这个背包确实是存在的,用来盛放我们请求交互传递的值;关于这一点,spring里面有一个注解:@ModelAttribute:被该注解修饰的方法,会在每一次请求时优先执行,用于接收前台js…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号