当前位置: 首页 > 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. 完整代码 一、实验介…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...