Json和Xml
一、前言
学习心得:C# 入门经典第8版书中的第21章《Json和Xml》
二、Xml的介绍
Xml的含义:
可标记性语言,它将数据以一种特别简单文本格式储存。让所有人和几乎所有的计算机都能理解。
XML文件示例:
<?xml version="1.0" encoding="utf-8"?>
<Books><CSharp Time="2019"><book>C# 入门经典</book><book>C# 高级编程</book><book>C# 深入解析</book><book>WPF 编程宝典</book></CSharp><Java></Java>
</Books> 
提示:
节点:在Xml文件中有多个节点,节点就是<节点>:用来声明一个节点 </节点> 结束当前节点。如果在当前的节点中创建了节点那么就是称呼为给当前的节点创建了一个子节点。元素和特性可以统称为节点。
元素:元素的含义是指<></>这样的标签。
特性:特性指某某元素的特性。如上述 Time 就是 Csharp的特性
三、Json的介绍
Json的含义:
Json在我们C#开发当中会使用到的第二种数据语言。它主要使用在Wen服务中和Wen浏览器中。
Json文件示例:
{"?xml": {"@version": "1.0","@encoding": "utf-8"},"Books": {"CSharp": {"@Time": "2019","book": [ "C# 入门经典", "C# 高级编程", "C# 深入解析", "WPF 编程宝典" ]},"Java": ""}
} 
示例解释:Json中使用{}表示数据块, 逗号分隔数据。[]为鉴定为数组。 冒号指定当前元素的值
提示:当前的Json示例与上面Xml示例存储的数据是一致的。
四、Xml 模式介绍和创建
1 Xml 模式的介绍
Xml模式是指在我们创建Xml文档时对文档的一种格式规范,使当前Xml文档不会出现不打算处理的数据。C#使用的标准模式xml格式时XSD(XML Schema Definition)
2 Xml 模式的创建
上述介绍可能不太能理解,我们创建一下就能理解了。共三步
2.1 打开Visual Studio 创建Xml文件

 
看到下面的页面则代表创建成功了

2.2 输入想要的Xml格式。(创建一个规范的Xml格式)
示例:
<?xml version="1.0" encoding="utf-8"?>
<Student><Name name=""><Height></Height><Weight></Weight><Class></Class></Name>
</Student> 
保存
 输入保存的名字以及路径
2.3 创建XML模式(XML架构)

随后编译器为我们生成了一个Xsd后缀的一个文件
 一样的将当前文件保存。
 创建结束(创建了一个StudentXml 模式) 
3 Xml 文件模式使用
将上面我们创建的模式使用起来
3.1 先创建一个Xml文件(同样的方式)
3.2 指定使用的模式(使用的架构)

 如果表格中没有您创建的架构可以,在右侧添加。 
3.3 使用Xml模式(架构)
在我们输入的时,智能提示就显示了我们之前的格式,可以帮助我们快速创建一个刚刚一样格式的Xml文件。

示例:
<?xml version="1.0" encoding="utf-8"?>
<Student><Name name="张三"><Height> 188 </Height><Weight>75kg</Weight><Class>1805</Class></Name>
</Student> 
注意:如果您添加我们模式中没有的节点我们的编译器会报警告。

提示:如果您需要反复使用当前的模式建议把当前模式添加到Visual Studio中的XML架构中
五、读取和处理Xml文件
1 访问和处理Xml文件的类
| 类名 | 描述 | 
|---|---|
| XmlNode | 表示文档中的一个元素。 | 
| XmlDocument | 读取存储在磁盘或网络地址上的Xml文件。 | 
| XmlElement | 表示一个元素,通常用来储存根目录。 | 
| XmlAttribute | 表示节点中的特性。 | 
| XmlText | 表示节点中的文本数据。 | 
| XmlComment | 表示特殊类型元素,不是Xml文件的一部分,用于便于阅读的其他拓展信息。 | 
| XmlNodeList | 表示一个元素集合。 | 
举个例子:
  //XmlDocument 继承 XmlNode   XmlDocument document = new XmlDocument();document.Load(@"C:\Users\Administrator\Desktop\XMLFile2.xml"); 
示例解释:
XmlDocument 通过方法Load读取数据文件,参数为指定的Xml文件的路径,无返回类型。
//获取文档的根目录  也就获取了XML的所有文件内容。
XmlElement xmlElement= document.DocumentElement; 
示例解释:
(XmlDocument类型) DocumentElement属性返回当前Xml文件的根目录,如果没有则返回Null。
 //获取当前节点中后面的第一个节点XmlNode xmlNode = xmlElement.FirstChild;//获取当前节点中的最后一个节点XmlNode xmlNode1 = xmlElement.LastChild;//获取当前节点中的父节点XmlNode xmlNode2 = xmlElement.ParentNode;// 访问同一层级的下一个节点,而不考虑节点类型XmlNode xmlNode3 = xmlElement.NextSibling;//获取当前 是否有子节点Boolean IshaveXmlNode = xmlElement.HasChildNodes; 
示例解释:
我使用到了多种属性,类型都是一个节点XmlNode类型,代码当中都有相关注释。
其中:
XmlText、XmlComment、XmlAttribute、XmlNode 是没有公共的无参构造函数或是抽象的类。但我们都可以通过 XmlDocument实例来创建

示例(读取Xml文件的节点)
 //获取所有节点foreach (XmlNode item in xmlElement.ChildNodes){Console.WriteLine("根节点下有"+ item.Name + "节点");foreach (XmlNode item2 in item.ChildNodes){Console.WriteLine($"{item.Name}节点下有"+ item2.Name+"节点");}} 
示例解释:ChildNodes是获取当前节点的所有子节点 。
输出 :
 
2 示例(获取Xml内容,书上示例)
   private string FormatText(XmlNode node, string text, string indent){if (node is XmlText){text += node.Value;return text;}if (string.IsNullOrEmpty(indent))indent = "";else{text += "\r\n" + indent;}if (node is XmlComment){text += node.OuterXml;return text;}text += "<" + node.Name;if (node.Attributes.Count > 0){AddAttributes(node, ref text);}if (node.HasChildNodes){text += ">";foreach (XmlNode child in node.ChildNodes){text = FormatText(child, text, indent + "  ");}if (node.ChildNodes.Count == 1 &&(node.FirstChild is XmlText || node.FirstChild is XmlComment))text += "</" + node.Name + ">";elsetext += "\r\n" + indent + "</" + node.Name + ">";}elsetext += " />";return text;} 
  private void AddAttributes(XmlNode node, ref string text){foreach (XmlAttribute xa in node.Attributes){text += " " + xa.Name + "='" + xa.Value + "'";}} 
使用方式:
 XmlDocument document = new XmlDocument();document.Load(booksFile);textBlockResults.Text = FormatText(document.DocumentElement as XmlNode, "", ""); 
示例解释:
如其中的node is XmlText 来判断当前节点是否包含了文本 如前面的示例Class Weight Height 这三个是XmlText 因为只有他们是实际包含了文本。其中的XmlComment判断也类似。
3 节点的操作
3.1 修改:
可以通过Value 属性来获取,但如果不是实际包含了文本,那么返回结果就是Null
3.2 插入:
前面提到 XmlText、XmlComment、XmlAttribute、XmlNode 其中我们可以通过XmlDocument使用方法来创建
举个例子:
  XmlDocument document = new XmlDocument(); document.Load(booksFile);//创建一个特性document.CreateAttribute("特性");//创建一个节点 是什么类型,节点名称,"节点的Uri"document.CreateNode(XmlNodeType.Text,"名字","节点的名称空间 Uri");//创建一个XmlElement类型的节点 "document.CreateElement("节点名称");//创建一个XmlText类型的节点document.CreateTextNode("节点中显示的内容");//创建注释document.CreateComment("示例节点"); 
示例解释:展示了创建节点的多个方法。
将创建的节点添加进去:
  // 加载当前Xml文件XmlDocument document = new XmlDocument();document.Load(@"C:\Users\Administrator\Desktop\XMLFile3.xml");//获取根节点XmlElement root = document.DocumentElement;//创建节点 XmlElement newOther = document.CreateElement("Other");XmlComment comment = document.CreateComment("其他");XmlElement newXmlNode = document.CreateElement("FatherAndMother");XmlElement father = document.CreateElement("father");XmlElement mother = document.CreateElement("mother");XmlText liu = document.CreateTextNode("刘女士");XmlText li = document.CreateTextNode("李男士");//Other 节点下的节点newOther.AppendChild(newXmlNode);//Other节点的注释newOther.AppendChild(comment);//father and mother节点下的节点newXmlNode.AppendChild(father);newXmlNode.AppendChild(mother);//节点的文本mother.AppendChild(liu);father.AppendChild(li);root.InsertAfter(newOther,root.FirstChild);//保存文件document.Save(@"C:\Users\Administrator\Desktop\XMLFile3.xml"); 
效果:
 
3.3 删除
  XmlDocument document = new XmlDocument();document.Load(booksFile);XmlElement root = document.DocumentElement;if (root.HasChildNodes){XmlNode book = root.LastChild;root.RemoveChild(book);document.Save(booksFile);} 
3.4 选择
SerializeXmlNode返回第一个匹配的节点
 XmlDocument document = new XmlDocument();document.Load(booksFile);//返回根目录string str = Newtonsoft.Json.JsonConvert.SerializeXmlNode(document); 
六、XML转换为JSON
1安装Newtonsoft.Json 包


2 转换代码
 XmlDocument document = new XmlDocument();document.Load(@"C:\Users\Administrator\Desktop\XMLFile3.xml");string json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(document);System.IO.File.WriteAllText(@"C:\Users\Administrator\Desktop\XMLFile2.json", json); 
转换结果:
{"?xml": {"@version": "1.0","@encoding": "utf-8"},"Student": {"Name": {"@name": "张三","Height": " 188 ","Weight": "75kg","Class": "1805"},"Other": {"FatherAndMother": {"father": "李男士","mother": "刘女士"} /*其他*/}}
} 
七、XPath搜索XML文件
SelectNodes方法通过Xpath表达式来对Xml进行查找
  XmlDocument document = new XmlDocument();document.Load(@"C:\Users\Administrator\Desktop\XMLFile3.xml");XmlNodeList  xmlNodeList= document.DocumentElement.SelectNodes(".") ; 
示例解释:
在XPath中,
.代表当前节点。当你使用.时,它指代的是上下文中的当前节点。这通常用于在XPath表达式中指明相对位置,而不是从根节点开始定位节点。
1 Xpath表达式示例:
-  
选择节点:
- 选择所有节点: 
//* - 选择特定节点: 
/bookstore/book(选择根节点下的所有book节点) - 选择当前节点: 
. 
 - 选择所有节点: 
 -  
按名称选择:
- 选择所有名称为
title的节点://title - 选择当前节点的父节点: 
.. - 选择根节点: 
/ 
 - 选择所有名称为
 -  
按属性选择:
- 选择所有具有特定属性的节点: 
//*[@attribute] - 选择特定属性值的节点: 
//*[@attribute='value'] 
 - 选择所有具有特定属性的节点: 
 -  
按位置选择:
- 选择第一个节点: 
(//book)[1] - 选择最后一个节点: 
(//book)[last()] - 选择前几个节点: 
(//book)[position() <= 3] 
 - 选择第一个节点: 
 -  
按条件选择:
- 选择价格大于 50 的书籍: 
//book[price > 50] - 选择作者为"Author Name"的书籍: 
//book[author='Author Name'] - 选择第一个
book节点的title:/bookstore/book[1]/title 
 - 选择价格大于 50 的书籍: 
 
这些表达式可以帮助你根据需要定位XML文档中的不同节点。
相关文章:
Json和Xml
一、前言 学习心得:C# 入门经典第8版书中的第21章《Json和Xml》 二、Xml的介绍 Xml的含义: 可标记性语言,它将数据以一种特别简单文本格式储存。让所有人和几乎所有的计算机都能理解。 XML文件示例: <?xml version"1.…...
STM32 支持IAP的bootloader开发,使用串口通过Ymodem协议传输固件
资料下载: https://download.csdn.net/download/vvoennvv/88658447 一、概述 关于IAP的原理和Ymodem协议,本文不做任何论述,本文只论述bootloader如何使用串口通过Ymodem协议接收升级程序并进行IAP升级,以及bootloader和主程序两个工程的配置…...
【SVN】centos7搭建svn--亲测能通
centos7.6搭建svn 1 知识小课堂1.1 CentOS1.2 SVN 2 搭建过程2.1 前期准备2.2 通过yum命令安装svnserve2.3 创建版本库目录2.4 创建svn版本库2.5 配置修改2.5 防火墙配置2.6 启动或关闭svn服务器2.6.1 进程守护2.6.2 检测svn端口3690是否已经监听:2.6.3 关闭SVN 2.7…...
MY FILE SERVER: 1
下载地址 https://download.vulnhub.com/myfileserver/My_file_server_1.ova 首先我们需要发现ip 我的kali是59.162所以167就是靶机的 然后我们拿nmap扫一下端口 nmap -sV -p- 192.168.59.167 扫完发现有七个端口开放 按照习惯先看80 没看到有啥有用信息,用nikto扫一下 nik…...
Day70力扣打卡
打卡记录 收集足够苹果的最小花园周长(找规律 二分) 链接 class Solution:def minimumPerimeter(self, neededApples: int) -> int:l, r 1, 10 ** 5while l < r:mid (l r) >> 1if 2 * (2 * (mid ** 3) 3 * (mid ** 2) mid) > nee…...
3. 行为模式 - 迭代器模式
亦称: Iterator 意图 迭代器模式是一种行为设计模式, 让你能在不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素。 问题 集合是编程中最常使用的数据类型之一。 尽管如此, 集合只是一组对象的…...
rsync文件同步
场景:主要是用来发布文件。 一、rsync服务器端架设 1、安装 wget https://download.samba.org/pub/rsync/src/rsync-3.0.6.tar.gz tar -zxvf rsync-3.0.6.tar.gz ./configure --prefix/usr/local/rsync make make install 2、配置 2.1、配置rsyncd.conf 不存在…...
docker 安装mysql 8.0.35
1.拉取镜像 docker pull mysql:8.0.35 2.创建相关挂载目录与文件 mkdir -p /opt/mysql8/conf mkdir -p /opt/mysql8/data mkdir -p /opt/mysql8/logs 或者:mkdir -p /opt/mysql8/{data,conf,logs,mysqld,mysql-files} 文件与文件夹授权:chmod -R 775 /opt/mysql8/* 3.运…...
力扣labuladong一刷day46天并查集
力扣labuladong一刷day46天并查集 文章目录 力扣labuladong一刷day46天并查集一、323. 无向图中连通分量的数目二、130. 被围绕的区域三、990. 等式方程的可满足性 一、323. 无向图中连通分量的数目 题目链接:https://leetcode.cn/problems/number-of-connected-co…...
C++11(上):新特性讲解
C11新特性讲解 前言1.列表初始化1.1{ }初始化1.2std::initializer_list 2.类型推导2.1 auto2.2 typeid2.3 decltype 3.范围for4.STL的变化4.1新容器4.2容器的新方法 5.右值引用和移动语义5.1 左值引用和右值引用5.2 左值引用与右值引用比较5.3 右值引用的使用场景5.4 右值、左值…...
将mapper.xml保存为idea的文件模板
将mapper.xml保存为idea的文件模板 在idea的File and Code Templates中将需要使用模板的内容添加为模板文件。 那么接下来请看图,跟着步骤操作吧。 mapper.xml文件内容 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper P…...
LabVIEW在横向辅助驾驶系统开发中的应用
LabVIEW在横向辅助驾驶系统开发中的应用 随着横向辅助驾驶技术的快速发展,越来越多的研究致力于提高该系统的效率和安全性。项目针对先进驾驶辅助系统(ADAS)中的横向辅助驾驶进行深入研究。在这项研究中,LabVIEW作为一个强大的系…...
STM32移植LVGL图形库
1、问题1:中文字符keil编译错误 解决方法:在KEIL中Options for Target Flash -> C/C -> Misc Controls添加“--localeenglish”。 问题2:LVGL中显示中文字符 使用 LVGL 官方的在线字体转换工具: Online font converter -…...
迪文屏开发保姆级教程5—表盘时钟和文本RTC显示
这篇文章要讲啥事呢? 本篇文章主要介绍了在DGBUS平台上使用表盘时钟和文本时钟RTC显示功能的方法。 文哥悄悄话: 官方开发指南PDF:(不方便下载的私聊我发给你) https://download.csdn.net/download/qq_21370051/8864…...
免费IDEA插件推荐-Apipost-Helper
IDEA插件市场中的API调试插件不是收费(Fast Request )就是不好用(apidoc、apidocx等等)今天给大家介绍一款国产的API调试插件:Apipost-Helper,完全免费且好看好用! 这款插件由Apipost团队开发的…...
Django(二)
1.django框架 1.1 安装 pip install django3.21.2 命令行 创建项目 cd 指定目录 django-admin startproject 项目名mysite ├── manage.py [项目的管理工具] └── mysite├── __init__.py├── settings.py 【配置文件,只有一部分…...
Kafka集群架构服务端核心概念
目录 Kafka集群选举 controller选举机制 Leader partition选举 leader partition自平衡 partition故障恢复机制 follower故障 leader故障 HW一致性保障 HW同步过程 Epoch Kafka集群选举 1. 在多个broker中, 需要选举出一个broker, 担任controller. 由controller来管理…...
【vscode插件】之插件图标设置
ChatgGPT4.0国内站点: 海鲸AI-支持GPT(3.5/4.0),文件分析,AI绘图 在Visual Studio Code中创建插件时,你可以为你的插件设置一个图标,这个图标会在VS Code的插件市场和插件侧边栏中显示。以下是设置插件图标的步骤: 准备…...
网络安全学习-NTFS安全权限、文件共享
NTFS安全权限 权限概述 设置NTFS权限,实现不同用户访问不同对象(文件、文件夹)的权限分配正确访问权限后,用户才能访问资源设置权限防止资源被篡改、删除 文件系统概述 文件系统就是这个分区的存储格式,不建立文件…...
如何使用GPT4写一篇综述
使用 GPT-4 或任何其他高级语言模型来撰写一篇综述文章,需要遵循一系列的步骤来确保内容的准确性、深度和组织性。以下是一些指导步骤: 确定主题和范围 明确你想要综述的主题。这可以是一个科学领域的特定方面、技术发展、理论进展等。 确定综述的范围和…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
