C# LINQ to XML 读取XML文件快速入门

目录

前言

一、什么是XML?

二、XML格式

1. 相关定义

2. 举例

三、代码实例——创建、保存、读取XML

总结


前言

工作需要,想读取XML文件的内容,在网上找了许多资料,各种类型、方法都有。

自己水平有限,资料里的各种代码拼凑起来也容易有冲突。

所以自己整理了读取XML的简单方法,把代码整理出来。配合一些字符串处理函数,可以处理简单的XML文件。

使用控制台模板,可以直接运行代码。希望对想要快速开发的初学者有所帮助。


一、什么是XML?

关于定义网上有很多,这里摘抄一下:

  • XML 指可扩展标记语言(EXtensible Markup Language)
  • XML 是一种标记语言,很类似 HTML
  • XML 的设计宗旨是传输数据,而非显示数据
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准

XML是具有特殊格式的纯文本,具有严格的格式限制,应用非常广。

二、XML格式

1. 相关定义

一个XML文件包含:文档声明、注释、元素、属性、值等。

文档声明:在生成时默认都会自动添加声明,XML主要作用在于读取,因此不常操作。

注释(Comment):相当于XML的标签、注解,可为空。

元素(Element):一个XML必须有且只有一个根元素。通常根元素命名为Root,但是不强制。父元素、子元素、同级元素数量、名称无要求,可重名。

属性(Attribute):对元素提供详细的信息。目前我还没有进一步了解,留个坑。

注意:XML是区分大小写的。 

2. 举例

下面举一个简单的例子:

<?xml version="1.0" encoding="utf-8"?>           
<!--This is a comment-->
<Root>
  <Element>
    <Element1>value1</Element1>
    <Element2>value2</Element2>
    <Child>name1</Child>
    <Child>name2</Child>
    <Child>name3</Child>
  </Element>
</Root>

第一行是XML文件的声明,定义了文件的版本(1.0)和使用的编码(utf-8)

第二行是XML的注释行,可为空。

第三行开始是元素的树形结构,根元素Root有且只有一个,其余元素可以有多个分支节点。(元素级别通常也用树形结构的节点作类比)

每个节点都用<Element>value</Element>的结构表示。两对<>之间夹着的是该元素所表示的值。

如上图,Root根节点下,有一个Element父节点,父节点下还有5个子节点。


三、代码实例——创建、保存、读取XML

代码以Console.WriteLine()函数作为分割,共分成四段:

  1. 创建一个XML文件,保存在test.xml中
  2. 加载已经保存的xml文件,在Root根节点,遍历输出Child节点的元素名和值,使用.Descendants()可以遍历元素内部全部子节点。
  3. 使用from - where - select语句遍历Root节点,可以更灵活的选择要查找的内容。
  4. 创建新的xml实例,索引条件为Root节点下元素值以value开头,直接输出第一步创建的xml内容。不过这段代码不常用。
// 新建一个xml,注意逗号 , 和括号 ) 的包含关系。右括号与该级别语句对齐更直观
XDocument srcTree = new XDocument(
	new XComment("This is a comment"),
	new XElement("Root",
		new XElement("Element1", "value1"),
		new XElement("Element2", "value2"),
		new XElement("Element3", "value3"),
		new XElement("Child", "name1"),
		new XElement("Child", "name2"),
		new XElement("Child", "name3")
	)
);
srcTree.Save(@"D:\test.xml");  // 保存在D盘test.xml
Console.WriteLine("test.xml已保存\n");
Console.WriteLine("------------------------------");

XDocument xDoc = XDocument.Load(@"D:\test.xml");  // 创建xDoc实例重新加载test.xml
//查找Root根节点下的Child元素,遍历后输出,方法1:
var elements = xDoc.Elements("Root").Descendants("Child");  // Descendants()可以遍历内部全部子节点
foreach (var e in elements)
{
	Console.WriteLine(e);  // 元素和值全部输出
	// Console.WriteLine(e.Name);  // 只输出元素 Element
	// Console.WriteLine(e.Value);  // 只输出值 value
}
Console.WriteLine("------------------------------");
// 方法2
var ele = from e in xDoc.Elements("Root").Descendants("Child")
		  where e.Name == "Child"
		  select e;
foreach (XElement xyz in ele)
{
	Console.WriteLine(xyz);
}
Console.WriteLine("------------------------------");

// 使用新的实例把上面的文档再输出一次,不常用
XDocument srcTreeNew = new XDocument(
	new XComment("This is a comment"),
	new XElement("Root",
		from el in srcTree.Element("Root").Elements()
		where ((string)el).StartsWith("value")  // 值是以value开头的全部输出
		select el
	)
);
Console.WriteLine(srcTreeNew);

Console.ReadKey();

运行结果

注:1. 上述代码是写在Main函数中

       2. 需要使用 using System.Xml.Linq; 命名空间

写的可能不是很明白,可以把代码运行一下,自己尝试修改代码,对比结果更容易理解一些。


总结

刚开始写技术博客,经验不足。大家也可以借鉴其他的博客和官方文档学习。

关于XML的操作有XDocument(LINQ to XML API)和XMLDocument(经典DOM API)两种方法。

更常用、操作更方便的是前者。具体区别参考:https://www.cnblogs.com/HQFZ/p/4788428.html

LINQ to XML微软官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.xml.linq.xdocument?view=net-5.0

其他LINQ to XML博客:

https://www.cnblogs.com/rosesmall/p/5577681.html

https://www.cnblogs.com/nsky/archive/2013/03/05/2944725.html#C3

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wujinglin7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值