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 + ">";
           else
               text += "\r\n" + indent + "</" + node.Name + ">";
       }
       else
           text += " />";
       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表达式示例:

  1. 选择节点:

    • 选择所有节点: //*
    • 选择特定节点: /bookstore/book (选择根节点下的所有book节点)
    • 选择当前节点: .
  2. 按名称选择:

    • 选择所有名称为title的节点: //title
    • 选择当前节点的父节点: ..
    • 选择根节点: /
  3. 按属性选择:

    • 选择所有具有特定属性的节点: //*[@attribute]
    • 选择特定属性值的节点: //*[@attribute='value']
  4. 按位置选择:

    • 选择第一个节点: (//book)[1]
    • 选择最后一个节点: (//book)[last()]
    • 选择前几个节点: (//book)[position() <= 3]
  5. 按条件选择:

    • 选择价格大于 50 的书籍: //book[price > 50]
    • 选择作者为"Author Name"的书籍: //book[author='Author Name']
    • 选择第一个book节点的title: /bookstore/book[1]/title

这些表达式可以帮助你根据需要定位XML文档中的不同节点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/268683.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动驾驶学习笔记(二十二)——自动泊车算法

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo开放平台9.0专项技术公开课》免费报名—>传送门 文章目录 前言 感知算法 定位算法 规划算法…

分享70个Java源码总有一个是你想要的

分享70个Java源码总有一个是你想要的 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1s8ZVYHb5B1GgXMlpG-6-Iw?pwd6666 提取码&#xff1a;6666 项目名称 admin、cms、console 等多…

nodejs+vue+微信小程序+python+PHP的4s店客户管理系统-计算机毕业设计推荐

系统的功能结构是系统实现的框架&#xff0c;本系统的主要结构为管理员和用户、员工。管理员的功能为车辆信息管理、用户管理、售后服务管理、售后安排管理、完成售后管理等。 本系统实现了售后的在线申请与处理&#xff0c;方便了用户和管理员、员工三方的利益&#xff0c;提高…

Linux 宝塔mysql莫名其妙数据库不见了恢复数据库

起因&#xff1a;宝塔安装的mysql 线上运行突然表包括库都不见了&#xff0c;想办法恢复数据库 登陆mysql cd /www/server/mysql/binmysql -u root -p查看binlog日志是否打开 show variables like log_%;log_bin如果为 ON 则为开启状态&#xff0c;如果开启了才可以进行下一…

【SD】差异值 生成 同一人物 制作 表情包 【1】

说明&#xff1a;只对AI生成的人物&#xff0c;效果稳定。 Reference差异值 生成表情 首先生成一张图片。 测试命令&#xff1a;1 man,chibi,full body, 模型&#xff1a;envyclarityxl02_v10.safetensors [f6c13197db] 种子&#xff1a;2704867166 》》测试命令&#xff1a…

智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金豺算法4.实验参数设定5.算法结果6.参考文献7.MA…

力扣:51. N 皇后

题目&#xff1a; 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的…

网络7层架构

网络 7 层架构 什么是OSI七层模型&#xff1f; OSI模型用于定义并理解数据从一台计算机转移到另一台计算机&#xff0c;在最基本的形式中&#xff0c;两台计算机通过网线和连接器相互连接&#xff0c;在网卡的帮助下共享数据&#xff0c;形成一个网络&#xff0c;但是一台计算…

Unity重写Inspector简化分组配置文件

Unity重写Inspector简化分组配置文件 重写Inspector创建分组管理配置文件创建修改参数参数对应类工程在我的资源中名为CreateConfig&#xff0c;免费下载 重写Inspector创建分组管理配置文件 创建 修改参数 参数对应类 using UnityEngine;public class GameConfig : Scriptab…

【UML】第13篇 序列图(2/2)——建模的方法

目录 三、序列图建模 3.1 概述 3.2 建模的步骤 3.3 举例说明步骤 1.确定主要场景和流程 2.确定参与的对象 3.绘制序列图 4.注意事项 3.4 特殊的情况 序列图是我个人认为&#xff0c;UML中最重要的图之一。 而且序列图&#xff0c;对于业务建模&#xff0c;也有非常好…

【Filament】立方体贴图(6张图)

1 前言 本文通过一个立方体贴图的例子&#xff0c;讲解三维纹理贴图&#xff08;子网格贴图&#xff09;的应用&#xff0c;案例中使用 6 张不同的图片给立方体贴图&#xff0c;图片如下。 读者如果对 Filament 不太熟悉&#xff0c;请回顾以下内容。 Filament环境搭建绘制三角…

java调用GDAL实现栅格数据的重采样的一种方法

目录 1.关于重采样 1.1概念 1.2用途 1.3常见算法 2.关于GDAL 2.1GDAL中的重采样算法 3.实现重采样 3.1思路 3.2完整代码 3.3使用QGIS验证效果 1.关于重采样 1.1概念 重采样是以原始图像的像元值或者导出的值填充到新的图像的每个像元的的过程。 1.2用途 在地理信…

数据库开发表操作案例的详细解析

2.3.1.4 案例 需求&#xff1a;根据产品原型/需求创建表((设计合理的数据类型、长度、约束) 产品原型及需求如下&#xff1a; 步骤&#xff1a; 阅读产品原型及需求文档&#xff0c;看看里面涉及到哪些字段。 查看需求文档说明&#xff0c;确认各个字段的类型以及字段存储数据…

关于Python里xlwings库对Excel表格的操作(十七)

这篇小笔记主要记录如何【获取和设置单元格行高、列宽】。 前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &#xff08;2&#xff09;如何在W…

【Python】pip管理Python包

命令&#xff1a;pip install <包名> 安装指定的包。 pip install ipython #或者 pip install ipython -i https://mirrors.aliyun.com/pypi/simple/ 命令&#xff1a;pip uninstall <包名> 删除指定的包。 pip uninstall ipython 命令&#xff1a;pip list 显…

SpringBoot2.x+mybatis plus3.x集成Activit7版本

文/朱季谦 在Activiti6版本当中&#xff0c;若要集成到Springboot里&#xff0c;需要写一些额外的配置类&#xff0c;我曾经在Activiti工作流框架学习笔记&#xff08;二&#xff09;之springboot2.0整合工作流Activiti6.0一文当中总结过相关配置过程&#xff0c;感兴趣的同学…

Leetcode162. 寻找峰值

Every day a Leetcode 题目来源&#xff1a;162. 寻找峰值 解法1&#xff1a;STL 代码&#xff1a; class Solution { public:int findPeakElement(vector<int>& nums) {return max_element(nums.begin(), nums.end()) - nums.begin();} };复杂度分析&#xff1…

【二叉树】【单调双向队列】LeetCode239:滑动窗口最大值

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 涉及知识点 单调双向队列 二叉树 题目 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动…

Python 数据分析 Matplotlib篇 时间序列数据绘制折线图(第4讲)

Python 数据分析 Matplotlib篇 时间序列数据绘制折线图(第4讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

关于“Python”的核心知识点整理大全40

目录 alien_invasion.py game_functions.py 14.3.3 在外星人被消灭时更新得分 settings.py game_functions.py game_functions.py alien_invasion.py 14.3.4 将消灭的每个外星人的点数都计入得分 game_functions.py 14.3.5 提高点数 settings.py settings.py 注意…