当前位置: 首页 > news >正文

【C#】XML的基础知识以及读取XML文件

最近在学读取文件

目录

    • 介绍
      • 特点
      • 结构
      • XML的语法规则
      • XML 命名规则
    • C#操作XML
      • 新建
      • 读取
        • 第一种
        • 第二种
        • 第三种
      • 读取属性


介绍

XML (可扩展标记语言,eXtensible Markup Language) 是一种标记语言,它被设计用来传输和存储数据。

特点

  • 可扩展性:由于 XML 的语法灵活,可以通过定义新的标记和属性来扩展其功能。
  • 可读性:XML 的语法结构使其易于阅读和理解。
  • 平台无关性:XML 可以在不同的平台上被处理和解析,如 Windows、Linux、MacOS 等。
  • 编码规范:XML 规定了严格的语法和编码规范,确保数据的正确解析。

结构

一个简单的XML文档展示:
在这里插入图片描述

第一行是 XML 声明,它定义 XML 的版本和所使用的编码),然后是根元素,然后是根元素的子元素(当然,可以继续嵌套)

XML的结构由标签元素属性文本组成。

  • 标签(tag):以尖括号(< >)包围的单词或词组,用来起始和结束元素。

  • 元素(element):指标签包含的整个内容。元素通常由开始标签和结束标签组成,有时也可以是自封闭的标签。

  • 属性(attribute):定义在开始标签内的附加信息。属性是由名称和值组成的,它们用空格隔开。

  • 文本(text):元素内部不包含标签的部分。文本可以包含实际的数据或者说明信息。

在这里插入图片描述

XML的语法规则

  • XML文档必须有一个根元素,该元素是所有其他元素的父元素。
  • XML元素的开始标签和结束标签要成对出现。
  • XML标签名严格区分大小写。
  • XML属性必须在开始标签中定义,并且属性名和属性值必须用等号(=)分隔。
  • XML属性值必须用引号(" 或 ')括起来。
  • XML的注释 < !-- 这是注释内容 – >。
  • XML文档必须符合XML规范,即必须包含声明。

XML 命名规则

  • 名称不能以数字或者标点符号开始
  • 名称不能以字符 “xml”(或者 XML、Xml)开始
  • 名称不能包含空格

C#操作XML

新建

  • 添加—>类
    在这里插入图片描述

  • 选择XML文件->输入一个名称->点击添加在这里插入图片描述

  • 输入内容就可以了!!

<?xml version="1.0" encoding="utf-8" ?>
<person><person p="man"><name>LiHua</name><age>18</age><height>172</height></person><person p="woman"><name>Ling</name><age>18</age><height>168</height></person>
</person>

有了这个XML文件之后,接下来,我们可以对它进行一些操作了!!


读取

第一种

在这里插入图片描述

代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;namespace _02_XML操作
{class Program{static void Main(string[] args){XmlDocument xmlDoc = new XmlDocument();xmlDoc.Load("Person.xml");XmlNode root = xmlDoc.ChildNodes[1];XmlNodeList personList = root.ChildNodes;foreach (XmlNode person in personList){foreach (XmlNode node in person.ChildNodes){Console.WriteLine(node.Name + ":" + node.InnerText);}}}}
}

运行结果:
在这里插入图片描述


第二种

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;namespace _02_XML操作
{class Program{static void Main(string[] args){List<Person> list = new List<Person>();XmlDocument xmlDoc = new XmlDocument();xmlDoc.LoadXml(File.ReadAllText("Person.xml"));XmlNode root = xmlDoc.ChildNodes[1];XmlNodeList personList = root.ChildNodes;foreach(XmlNode person in personList){Person obj = new Person();foreach(XmlNode node in person.ChildNodes){if (node.Name == "name"){obj.name = node.InnerText;}else if (node.Name == "age"){obj.age = Int32.Parse(node.InnerText);}else if (node.Name == "height"){obj.height = Int32.Parse(node.InnerText);}}list.Add(obj);}foreach(Person p in list){Console.WriteLine(p.name + "," + p.age + "," + p.height);}}}
}

运行结果:
在这里插入图片描述


第三种

代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;namespace _02_XML操作
{class Program{static void Main(string[] args){List<Person> list = new List<Person>();XmlDocument xmlDoc = new XmlDocument();xmlDoc.LoadXml(File.ReadAllText("Person.xml"));XmlNode root = xmlDoc.ChildNodes[1];XmlNodeList personList = root.ChildNodes;foreach(XmlNode person in personList){Person obj = new Person();XmlElement nameEle = person["name"];obj.name = nameEle.InnerText;XmlElement ageEle = person["age"];obj.age = Int32.Parse(ageEle.InnerText);XmlElement heightEle = person["height"];obj.height = Int32.Parse(heightEle.InnerText);list.Add(obj);}foreach(Person p in list){Console.WriteLine(p.name + "," + p.age + "," + p.height);}}}
}

运行结果:
在这里插入图片描述

读取属性

代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;namespace _02_XML操作
{class Program{static void Main(string[] args){List<Person> list = new List<Person>();XmlDocument xmlDoc = new XmlDocument();xmlDoc.LoadXml(File.ReadAllText("Person.xml"));XmlNode root = xmlDoc.ChildNodes[1];XmlNodeList personList = root.ChildNodes;foreach(XmlNode person in personList){Person obj = new Person();//读取属性XmlAttributeCollection attriCol = person.Attributes;XmlAttribute attri = attriCol["p"];obj.p = attri.Value;XmlElement nameEle = person["name"];obj.name = nameEle.InnerText;XmlElement ageEle = person["age"];obj.age = Int32.Parse(ageEle.InnerText);XmlElement heightEle = person["height"];obj.height = Int32.Parse(heightEle.InnerText);list.Add(obj);}foreach(Person p in list){Console.WriteLine(p.p+","+p.name + "," + p.age + "," + p.height);}}}
}

运行结果:
在这里插入图片描述


💦更多内容请前往主页置顶或点击链接直达:
【unity3D】游戏开发专栏的目录

【VR】VR开发专栏的目录

相关文章:

【C#】XML的基础知识以及读取XML文件

最近在学读取文件 目录 介绍特点结构XML的语法规则XML 命名规则 C#操作XML新建读取第一种第二种第三种 读取属性 介绍 XML (可扩展标记语言&#xff0c;eXtensible Markup Language) 是一种标记语言&#xff0c;它被设计用来传输和存储数据。 特点 可扩展性&#xff1a;由于…...

Immutable.js简介

引子 看一段大家熟悉的代码 const state {str: wwming,obj: {y: 1},arr: [1, 2, 3] } const newState stateconsole.log(newState state) // truenewState和state是相等的 原因&#xff1a; 由于js的对象和数组都是引用类型。所以newState的state实际上是指向于同一块内存…...

C语言进阶教程(位操作和进制数的表示)

文章目录 前言一、左移和右移二、清除对应的位为0和设置对应的位为11.设置对应的位为12.清除对应的位为0 三、进制数的表示四、& ^ | ~总结 前言 本篇文章给大家讲解一下C语言中的位操作&#xff0c;在嵌入式中位操作是经常需要使用的&#xff0c;那么下面就让我们来学习一…...

Loguru:功能强大、简单易用的Python日志库

文章目录 Loguru:Python的日志库安装 Loguru基本用法配置 Loguruadd() 语句remove() 语句设置日志文件保留日志的等级设置控制台日志显示等级Loguru:Python的日志库 Loguru 是一个功能强大、简单易用的日志库,可以让 Python 的日志记录变得更加轻松。它提供了丰富的功能和配…...

idea之maven的安装与配置

我们到maven的官网里下载maven&#xff0c;地址&#xff1a;https://maven.apache.org/download.cgi下载完成后解压即可配置环境变量 此电脑–>右键–>属性–>高级系统设置–>环境变量–>系统变量&#xff08;S&#xff09;–>新建一个系统变量 变量名&…...

【最新面试问题记录持续更新,java,kotlin,android,flutter】

最近找工作&#xff0c;复习了下java相关的知识。发现已经对很多概念模糊了。记录一下。部分是往年面试题重新整理&#xff0c;部分是自己面试遇到的问题。持续更新中~ 目录 java相关1. 面向对象设计原则2. 面向对象的特征是什么3. 重载和重写4. 基本数据类型5. 装箱和拆箱6. …...

面试:经典问题解决思路

1. 秒杀系统架构 参考&#xff1a;秒杀系统架构优化思路 2. 如何防止订单重复提交 重复提交原因: 一种是由于用户在短时间内多次点击下单按钮&#xff0c;或浏览器刷新按钮导致。另一种则是由于Nginx或类似于SpringCloud Gateway的网关层&#xff0c;进行超时重试造成的。 方案…...

CG MAGIC分享3ds Max卡顿未保存处理方法有哪些?

3ds Max进行建模、渲染这一系列过程中&#xff0c;大家使用中都会遇到各种原因导致软件卡顿或崩溃是很常见的情况。 可以说卡机没关系&#xff0c;可是卡顿发生时&#xff0c;如果之前的工作没有及时保存&#xff0c;可能会导致数据的丢失和时间的浪费。这就是最让人烦躁的了&…...

[python 刷题] 238 Product of Array Except Self

[python 刷题] 238 Product of Array Except Self 题目&#xff1a; Given an integer array nums, return an array answer such that answer[i] is equal to the product of all the elements of nums except nums[i]. The product of any prefix or suffix of nums is guar…...

UG NX二次开发(C#)-计算直线到各个坐标系轴向的投影角度

文章目录 1、前言2、需求分析3、NXOpen方法实现3.1 创建基准坐标系3.2 然后计算直线到基准坐标系的轴向角度3.3 代码调用4、测试效果为:1、前言 最近有个粉丝问我如何计算直线到坐标系各个轴向的角度,这里用UG NX二次开发(C#)实现。当然,这里的内容是经验之谈,如果有更好的…...

C# ComboBox 和 枚举类型(Enum)相互关联

C# ComboBox 和 枚举类型(Enum)相互关联 目的 在C# Winform面板上的ComboBox选择项&#xff0c;由程序填写某个Enum的各个枚举项目。 在运行中读取ComboBox的选择项&#xff0c;返回Enum数值。 非编程方法 低阶做法可以在winform设计窗口手动填写&#xff0c;但是不会自动跟…...

Linux CentOS7 tree命令

tree就是树&#xff0c;是文件或文件名输出到控制台的一种显示形式。 tree命令作用&#xff1a;以树状图列出目录的内容&#xff0c;包括文件、子目录及子目录中的文件和目录等。 我们使用ll命令显示只能显示一个层级的普通文件和目录的名称。而使用tree则可以树的形式将指定…...

软件设计模式系列之九——桥接模式

1 模式的定义 桥接模式是一种结构型设计模式&#xff0c;它用于将抽象部分与其实现部分分离&#xff0c;以便它们可以独立地变化。这种模式涉及一个接口&#xff0c;它充当一个桥&#xff0c;使得具体类可以在不影响客户端代码的情况下改变。桥接模式将继承关系转化为组合关系…...

构造函数的调用规则

#include <iostream> #include <string> using namespace std; class person{ public:int m_age; // person(){ // cout<<"默认构造的调用"<<endl; // } // person(int age){ // m_ageage; // cout<<"有参构造的调用"<…...

第十章:枚举类与注解

10.1&#xff1a;枚举类的使用 当需要定义一组常量时&#xff0c;建议使用枚举类&#xff08;前提&#xff1a;类的对象只有有限个&#xff0c;确定的&#xff09; eg&#xff1a; 星期&#xff1a;Mondey、.....、Sunday 性别&#xff1a;Man、.....、Woman 线程状态&#xff…...

ChatGPT:字符串操作问题——提取包含括号的字符串中的题干内容

ChatGPT&#xff1a;字符串操作问题——提取包含括号的字符串中的题干内容 String title p.text().split(“(”)[0];为什么会报错 ChatGPT&#xff1a; 在这段代码中&#xff0c;您正在使用Java处理一个字符串&#xff08;假设是HTML或文本&#xff09;&#xff0c;尝试将其分…...

jvm中对象创建、内存布局以及访问定位

对象创建 Java语言层面&#xff0c;创建对象通常&#xff08;例外&#xff1a;复制、反序列化&#xff09;仅仅是一个new关键字即可&#xff0c;而在虚拟机中&#xff0c;对象&#xff08;限于普通Java对象&#xff0c;不包括数组和Class对象等&#xff09;的创建又是怎样一个过…...

C基础-操作符详解

操作符分类&#xff1a; 算数操作符&#xff1a; - * / % //算数操作符 // int main() // { // // /除法 1.整数除法(除号两端都是整数) 2浮点数除法&#xff0c;除号的两端只要有一个小数就执行小数除法 // // 除法中&#xff0c;除数为0 // int a 7 / 2; /…...

时序预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测

时序预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测 目录 时序预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测。…...

【深度学习实验】线性模型(五):使用Pytorch实现线性模型:基于鸢尾花数据集,对模型进行评估(使用随机梯度下降优化器)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入库 1. 线性模型linear_model 2. 损失函数loss_function 3. 鸢尾花数据预处理 4. 初始化权重和偏置 5. 优化器 6. 迭代 7. 测试集预测 8. 实验结果评估 9. 完整代码 一、实验介…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...