iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >如何快速上手LINQ to XML
  • 298
分享到

如何快速上手LINQ to XML

2024-04-02 19:04:59 298人浏览 泡泡鱼
摘要

如何快速上手LINQ to XML,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。操作XML的技术有很多种:1)DOM(Document O

如何快速上手LINQ to XML,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

操作XML的技术有很多种:

1)DOM(Document Object Model,文档对象模型),它为XML文档提供了一个标准的解析。

2)XPath和XSLT,它们提供了查询和格式化XML的功能。

3).net框架中提供了一些对XML操作的类(在System.XML命名空间下)。

4)LINQ to XML。

在我看来有了LINQ to XML技术,.NET中其它操纵XML的技术都可以弃而不用了,因为LINQ to XML操纵XML比其它技术都更简单更方便也更直观。

LINQ to XML 是基于LINQ的,所以可以使用LINQ的所有功能,如标准查询操作符(详细可阅读《LINQ标准查询操作符详解》)和LINQ的编程接口。使用LINQ to XML可以很方便地将XML文件加载到内存中,对XML文档中的节点进行查询修改删除等各种操作,然后又可以很方便地将操作后的XML文档保存回磁盘。

System.Xml.Linq的命名空间中包含了LINQ to XML处理XML用到的所有类,共有19个类,如下所示。

类                                    说明

如何快速上手LINQ to XML

Extensions                     包含 LINQ to XML 扩展方法。

如何快速上手LINQ to XML

XAttribute                       表示一个 XML 特性。

如何快速上手LINQ to XML

XCData                          表示一个包含 CDATA 的文本节点。

如何快速上手LINQ to XML

XComment                     表示一个 XML 注释。

如何快速上手LINQ to XML

XContainer                    表示可包含其他节点的节点。

如何快速上手LINQ to XML

XDeclaration                  表示一个 XML 声明。

如何快速上手LINQ to XML

XDocument                    表示 XML 文档。

如何快速上手LINQ to XML

XDocument                    Type表示 XML 文档类型定义 (DTD)。

如何快速上手LINQ to XML

XElement                       表示一个 XML 元素。

如何快速上手LINQ to XML

XName                            表示 XML 元素或特性的名称。

如何快速上手LINQ to XML

XNamespace                   表示一个 XML 命名空间。 此类不能被继承。

如何快速上手LINQ to XML

Xnode                             表示 XML 树中节点的抽象概念(元素、注释、文档类型、处理指令或文本节点)。

如何快速上手LINQ to XML

XNodeDocumentOrderComparer            包含用于比较节点的文档顺序的功能。 无法继承此类。

如何快速上手LINQ to XML

XNodeEqualityComparer                        比较节点以确定其是否相等。 无法继承此类。

如何快速上手LINQ to XML

XObject                                                  表示 XML 树中的节点或特性。

如何快速上手LINQ to XML

XObjectChangeEventArgs                     提供有关 Changing 和 Changed 事件的数据。

如何快速上手LINQ to XML

XProcessingInstruction                          表示 XML 处理指令。

如何快速上手LINQ to XML

XStreamingElement                               表示支持延迟流输出的 XML 树中的元素。

如何快速上手LINQ to XML

XText                                                     表示一个文本节点。

这19个类提供了很多很多的方法,事实上很少人会在学习LINQ to XML的时候去学习每一种的方法的细节,本文的目的是让从来没有使用过LINQ to XML的童鞋在需要使用LINQ to XML技术的时候快速上手然后用之于自己的程序开发中,所以本文只讲LINQ to XML处理XML类中最常用、用到最多的三个类,分别是XDocument、XElement和XAttribute。

XDocument类派生于XContainer类,因此它可以有子节点,但XML的标准限制了XDocument对象只包含单个XElement子节点,因为XML文档只允许有一个根节点。

XDocument提供了处理有效XML文档,包括声明、注释和处理指令。

XDocument 可以包含以下元素:

1)一个 XDeclaration 对象。 XDeclaration 使您能够指定 XML 声明的相关部分:XML 版本、文档的编码以及 XML 文档是否是独立的。

2)一个 XElement 对象。 这是 XML 文档的根节点。

3)任意数目的 XProcessingInstruction 对象。 处理指令将信息传递给处理 XML 的应用程序。

4)任意数目的 XComment 对象。 注释将与根元素同级。 XComment 对象不能是列表中的***个参数,因为 XML 文档以注释开头无效。

5)一个用于 DTD 的 XDocumentType。

XDocument类提供的方法可参考MSDN文档。

XElement派生自XContainer,而XContainer又派生于XNode类,所以一个元素也是一个节点。通过XElement可以创建XML的元素,添加和修改,移除元素以及子元素。

XElement类提供了很多方法,因为一个XML文档中最为核心的东西就是XElement,这些方法使得我们处理XML提供如囊中取物般简单。

XElement类提供的方法可以参考MSDN文档。

XAttribute派生于XObject类,不是派生于XNode类,所以XAttribute不能作为XML树中的节点,它是与XElement相关联的名称/值对,也就是XAttibute不能独立于元素而存在。

XAttribute类提供的方法可参考MSDN文档。

本文的重点是讲述如何用LINQ to XML技术操纵XML文档,包含如何创建一个XML文档,如何保存XML文档,如何遍历XML文档元素,如何查找XML文档元素,如何更新XML文档的元素,如何删除XML文档元素等,下面我们假设一个应用场景来使用LINQ to XML技术来实现刚才所说的种种操作。

场景:将中国的省市区信息保存在一个XML文档中,可以方便地对该文档进行各种操作,如查询,更新,删除元素等。

下面我们先创建省市区的相关类,如下:

public class Province      {         /// <summary>        /// 省份名称         /// </summary>        public string Name { get; set; }         /// <summary>        /// 省会         /// </summary>        public string Capital { get; set; }       }       public class City      {          /// <summary>         /// 城市名称          /// </summary>         public string Name { get; set; }          /// <summary>         /// 城市编号          /// </summary>         public string Code { get; set; }           public Province Province { get; set; }      }       public class District      {          /// <summary>         /// 区名          /// </summary>         public string Name { get; set; }           /// <summary>         /// 描述          /// </summary>         public string Description { get; set; }           public City City { get; set; }      }

1)如何创建一个保存中国省市区信息的XML文档。

使用LINQ to XML 创建一个XML文档非常简单,代码如下:

static void Main(string[] args)          {              //获取当前应用程序目录下Area.xml文件的路径              string _filePath = Path.Combine(System.AppDomain.CurrentDomain.SetupInfORMation.ApplicationBase, "Area.xml");              FileInfo fiXML = new FileInfo(_filePath);              //如果文件不存在              if (!(fiXML.Exists))              {                  XDocument xelLog = new XDocument(                      new XDeclaration("1.0", "utf-8", "yes"),                      new XComment("XML File For AREA"),                      new XElement("Provinces",                                   new XElement("Province", new XAttribute("Name", "省份"),                                                new XElement("City", new XAttribute("Name", "城市"),                                                             new XElement("District", new XAttribute("Name", "行政区")))                                        )                          )                      );                  xelLog.Save(_filePath);              }          }

这段代码使用指定的内容初始化 XDocument 类的新实例,然后调用XDocument的Save方法来生成一个XML文档。很少使用XDocument来创建XML树,通常是使用 XElement 根节点创建 XML 树。除非具有创建文档的具体要求(例如,必须在***创建处理指令和注释,或者必须支持文档类型),否则使用 XElement 作为根节点通常会更方便。运行这段代码,就会在生成的应用程序根目录下创建一个名为Area.xml的文档,文档内容如下:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> <!--XML File For AREA--> <Provinces>   <Province Name="省份">     <City Name="城市">       <District Name="行政区" />     </City>   </Province> </Provinces>

2)如何将一个XML树加载到程序内存。

我们操作一个XML文档首先是需要将该文档加载到程序的内存中,在LINQ to XML中,通常是使用XElement类型的Load方法将XML文档自根节点开始的XML树加载到一个XElement类型的对象中,然后我们就可以采用XElement提供的各种方法对这个内存中XML文档进行各种操作。

我们创建一个LINQtoXML的帮助类LinqToXmlHelper.cs,将对XML操作的相关方法都写在这个类里面,下面是一个加载XML文档到XElement对象的方法。

/// <summary>         /// 将Area.xml文档加载到内存中的XElement类型的对象xElement,成功调用 XElement.Load方法后会在xElement保存整棵XML树          /// </summary>         /// <returns></returns>         public XElement Load()          {              XElement xElement = XElement.Load(_filePath);              return xElement;          }

我们刚才已经创建了一个XML文档,现在我们将这个文档加载到内存中,然后打印这个XElement对象。

static void Main(string[] args)          {              LinqToXmlHelper linqToXmlHelper = new LinqToXmlHelper();              var elements = linqToXmlHelper.Load();              string str = elements.ToString();               Console.WriteLine(str);              Console.ReadKey();  }

输出结果如下:

如何快速上手LINQ to XML

3)如何向现有的XML文档插入新的元素

到现在,我们已经了解了LINQ to XML中创建和加载XML文档的方式,接下来的问题就是如何向一个已经存在的XML文档添加新的节点。下面是增加新元素的方法,我们可以向Area.xml文档中添加新是省份城市和区域信息,如果已经存在的区域则进行更新,这里用XElement的Save对更改后的XML文档进行保存。

/// <summary>        /// 增加新元素,如果要增加的区已经存在,则对区的Description进行更新         /// </summary>        /// <param name="districts"></param>        public void AddElement(IList<District> districts)         {             if(districts==null||districts.Count==0) return;              XElement xElement = Load();             foreach (District district in districts)             {                 if (district.City == null || district.City.Province == null)                 {                     continue;                 }                 XElement provinceElement = xElement.Elements("Province").Where(e => ((string)e.Attribute("Name")).Equals(district.City.Province.Name)).FirstOrDefault();                //判断该省份是否存在,不存在曾增加该省份的节点                 if(provinceElement==null)                 {                      provinceElement = new XElement("Province", new XAttribute("Name", district.City.Province.Name), new XAttribute("Capital", district.City.Province.Capital));                     xElement.Add(provinceElement);                 }                  XElement cityElement = provinceElement.Elements("City").Where(e => ((string)e.Attribute("Name")).Equals(district.City.Name)).FirstOrDefault();                 //判断该城市是否存在,不存在则在对应省份下增加该城市的节点                 if(cityElement==null)                 {                     cityElement = new XElement("City", new XAttribute("Name", district.City.Name), new XAttribute("Code", district.City.Code));                     provinceElement.Add(cityElement);                 }                  XElement districtElement = xElement.Elements("District").Where(e => ((string)e.Attribute("Name")).Equals(district.Name)).FirstOrDefault();                 //如果存在该区域的节点则先删除在添加,以这种方式更新节点                 if(districtElement!=null)                 {                     districtElement.Remove();                 }                 districtElement = new XElement("District", new XAttribute("Name", district.Name), new XAttribute("Description", district.Description));                 cityElement.Add(districtElement);              }            //操作完毕,将内存中的XML树保存回硬盘的XML文档中。           xElement.Save(_filePath);         }

上面的AddElement方法中,调用XElement对象的传一个XElement对象的Add方法, 可以将一个XElement对象(节点)添加为一个已有节点的最后子节点。这样我们通过Add的方式就可以轻易扩展一个节点的子节点。

下面调用增加新元素AddElement方法,将一个区的集合信息保存到Area.xml文档中,然后打印XML树。代码如下:

static void Main(string[] args)          {                            LinqToXmlHelper linqToXmlHelper = new LinqToXmlHelper();              Province province = new Province() { Name = "广东省", Capital = "广州市" };              City city = new City() { Name = "广州市", Code = "020", Province = province };              IList<District> districts = new List<District>()                                              { new District() {City = city, Name = "天河区", Description = "天河区的描述"}, new District() {City = city, Name = "越秀区", Description = "越秀区的描述"}                                                                                                };              linqToXmlHelper.AddElement(districts);              XElement xElement = linqToXmlHelper.Load();              Console.WriteLine(xElement.ToString());  }

输出结果如图:

如何快速上手LINQ to XML

4)如何查询和遍历XML文档的元素

根据XElement类型提供的Elements方法,我们可以获取某个节点的所有子节点元素,也可以通过传入节点名称为参数,获取某个节点下所有和参数节点名称相匹配的节点集合,可以根据XElement类型提供的Attibute方法获取某节点的属性信息,下面代码示例根据城市名查询该城市下所有的区的信息:

/// <summary>         /// 根据城市名查询该城市下所有的区的信息          /// </summary>         /// <param name="cityName"></param>         /// <returns></returns>         public IList<District> GetDistricts(string cityName)          {              IList<District> districts = new List<District>();              XElement xElement = Load();              //获取城市名为变量cityName的节点的所有子节点              IEnumerable<XElement> xElementxElements =                  xElement.Elements("Province").Elements().Where(e => ((string) e.Attribute("Name")).Equals(cityName)).Elements();              foreach (XElement element in xElements)              {                  District district = new District();                  district.Name = (string) element.Attribute("Name");                  district.Description = (string) element.Attribute("Description");                  districts.Add(district);               }              return districts;          }

调用GetDistricts方法

static void Main(string[] args)          {                            LinqToXmlHelper linqToXmlHelper = new LinqToXmlHelper();              IList<District> districts = linqToXmlHelper.GetDistricts("广州市");              foreach (var district in districts)              {                  Console.WriteLine(district.Name);              }            }

输出结果为:

天河区

越秀区

5)如何删除XML文档中的节点元素

删除区的节点元素的方法,这里假定区的名称是唯一的

/// <summary>         /// 删除区的节点元素,这里假定区的名称是唯一的          /// </summary>         /// <param name="districts"></param>         public void DeleteElement(IList<District> districts)          {              XElement xElement = Load();              foreach (District district in districts)              {                                   XElement districtElement = xElement.Elements("Province").Elements("City").Elements("District").Where(e => ((string)e.Attribute("Name")).Equals(district.Name)).FirstOrDefault();                  if(districtElement!=null)                  {                      districtElement.Remove();                  }              }              xElement.Save(_filePath);           }

调用XElement.Remove方法可以在当前节点的父节点上删除当前节点。下面代码删除区节点中名称为“越秀区”的节点。

static void Main(string[] args)          {                            LinqToXmlHelper linqToXmlHelper = new LinqToXmlHelper();              IList<District> districts = new List<District>(){new District(){Name = "越秀区"} };              linqToXmlHelper.DeleteElement(districts);              XElement xElement = linqToXmlHelper.Load();              Console.WriteLine(xElement.ToString());              Console.ReadKey();           }

输出结果为:

如何快速上手LINQ to XML

到这里,你已经看到了LINQ to XML技术操作XML最为常用一些功能,包括创建和加载XML文档,新增删除更新XML节点等。

关于如何快速上手LINQ to XML问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网VUE频道了解更多相关知识。

--结束END--

本文标题: 如何快速上手LINQ to XML

本文链接: https://www.lsjlt.com/news/86433.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何快速上手LINQ to XML
    如何快速上手LINQ to XML,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。操作XML的技术有很多种:1)DOM(Document O...
    99+
    2024-04-02
  • 如何快速上手SQL
    这篇文章主要为大家展示了“如何快速上手SQL”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何快速上手SQL”这篇文章吧。两张示例表为了方便练习SQL语法,特地...
    99+
    2024-04-02
  • 如何快速上手Rollup
    本篇内容主要讲解“如何快速上手Rollup”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何快速上手Rollup”吧!什么是rollup?系统的了解rollup...
    99+
    2024-04-02
  • 如何快速上手Picasso
    这篇文章将为大家详细讲解有关如何快速上手Picasso,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Picasso是Square公司出品的一款非常优秀的开源图片加载库,是目前Android开发中超级流行的...
    99+
    2023-06-27
  • 如何快速上手Vue3
    这篇文章主要讲解了“如何快速上手Vue3”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何快速上手Vue3”吧!Vue2 与 Vue3 的对比对 TypeS...
    99+
    2024-04-02
  • 如何快速上手MongoDB
    小编给大家分享一下如何快速上手MongoDB,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。...
    99+
    2023-06-27
  • 如何快速上手PostgreSQL
    本篇内容介绍了“如何快速上手PostgreSQL”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、安装首先,安装PostgreSQL客户端。...
    99+
    2023-06-27
  • 如何快速上手SaltStack
    这篇文章给大家分享的是有关如何快速上手SaltStack的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言...
    99+
    2023-06-27
  • 如何快速上手MMdnn
    这篇“如何快速上手MMdnn”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何快速上手MMdnn”文章吧。MMdnn 是微软...
    99+
    2023-06-27
  • 如何快速上手GitHub
    这篇文章给大家分享的是有关如何快速上手GitHub的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 Git...
    99+
    2023-06-27
  • 如何快速上手coLinux
    这篇文章给大家分享的是有关如何快速上手coLinux的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。colinux位是一款可以帮助用户创建虚拟系统的工具,通过该软件,您可以在电脑上运行Linux系统,支持在win中...
    99+
    2023-06-27
  • Linux中如何快速上手Samba
    这篇文章主要介绍了Linux中如何快速上手Samba,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,有服务...
    99+
    2023-06-27
  • 如何快速上手python爬虫
    这篇“如何快速上手python爬虫”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何快速上手python爬虫”文章吧。“爬虫...
    99+
    2023-06-27
  • linux中如何快速上手cpustat
    小编给大家分享一下linux中如何快速上手cpustat,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!cpustat ,一个用于linux下,非常简单的CPU使用...
    99+
    2023-06-27
  • GN快速上手
    文章目录 背景GN快速入门使用GN建立构建环境交叉编译添加tutorial目标BUILD.gn配置说明 使用config使用默认配置 使用参数了解GN构建过程查找依赖GN文件执行脚...
    99+
    2023-09-12
    linux harmonyos
  • Scrapy快速上手
    超详细官方教程解析 https://blog.csdn.net/fly_yr/article/details/51540269   实战过程: 创建一个Scrapy项目 定义提取的Item 编写爬取网站的 spider 并提取 Item...
    99+
    2023-01-31
    上手 快速 Scrapy
  • linux中如何快速上手Iftop命令
    这篇文章主要介绍linux中如何快速上手Iftop命令,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Iftop的基本用法运行iftop命令,不带任何参数来查看默认界面的带宽使用情况,如下面的屏幕截图所示。$ ...
    99+
    2023-06-27
  • 如何快速上手Linux的uniq命令
    这篇文章给大家分享的是有关如何快速上手Linux的uniq命令的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Linux uniq命令用于检查及删除文本文件中重复出现的行列。uniq可检查文本文件中重复出现的行列。...
    99+
    2023-06-27
  • 如何快速上手Linux的size命令
    这篇文章主要介绍如何快速上手Linux的size命令,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!size命令用于查看目标文件、库或可执行文件中各段及其总和的大小,是 GNU 二进制工具集 GNU Binutils ...
    99+
    2023-06-27
  • 带你快速上手Servlet
    目录一、Servlet与Tomcat的关系二、什么是Servlet三、Servlet的类结构四、ServletConfig类五、ServletContext类六、Servlet的生命...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作