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表达式示例:

  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.hqwc.cn/news/299502.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

漏刻有时数据可视化Echarts组件开发(46)散点图颜色判断

series组件 series: [{name: Top 5,type: scatter,coordinateSystem: bmap,data: convertData(data.sort(function (a, b) {return b.value - a.value;}).slice(0, 6)),symbolSize: 20,encode: {value: 2},showEffectOn: render,rippleEffect: {brushType: stroke},label: {fo…

AG16KDDF256 User Manual

AGM AG16KDDF256 是由 AGM FPGA AG16K 与 DDR-SDRAM 叠封集成的芯片&#xff0c;具有 AG16K FPGA的可编程功能&#xff0c;提供更多可编程 IO&#xff0c;同时内部连接大容量 DDR-SDRAM。  FPGA 外部管脚 FBGA256 封装&#xff0c;管脚说明请见下表 Table-1&#xff1a; Tab…

一篇讲透:箭头函数、普通函数有什么区别

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热衷分享有趣实用的文章&#xff0c;希望大家多多支持&#xff0c;一起进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 什么是箭头函数 箭头函数和普通函数的区别 更简洁的语法 箭头函数…

【JAVA面试题】static的作用是什么?详细介绍

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 解释 静态变量&#xff08;类变量&#xff09;&#xff1a; 静态方法&#xff1a; 静态块&#xff1a; 静态内部类&#xff1a…

人工智能_机器学习074_SVM支持向量机_软间隔与优化目标函数构建_C参数由来_惩罚误差点的惩罚度---人工智能工作笔记0114

然后我们接着上一节再来看一下这里我们说有个 min_faces_per_person = 0 这个可以看到如果我们写上0,就意味着要加载所有的人脸图片,就会花费的时间久对吧 我们可以试试,这里我们 min_faces_per_person = 0 改成0然后 我们等一会加载完了以后,我们用 display(X.shape,faces.sh…

5g消息-5G时代短信升级-富媒体智能交互-互联网新入口

在5G时代&#xff0c;运营商和各大手机厂商都在积极推进5G消息的商用&#xff0c;基于短信入口的富媒体消息应用在近两年得到快速发展&#xff0c;并在企业端形成了广泛应用。 作为5G时代的数字原生应用&#xff0c;5G消息支持用户通过文字、图片、音频、视频、位置等富媒体方式…

Windows操作系统中:共享文件夹以及防火墙介绍

目录 一.共享文件夹 1.什么是共享文件夹 2.共享文件夹的优点以及不足 优点 不足之处 3.实际案例操作 共享介绍 普通共享 实例展示 高级共享 实例展示 二.防火墙 1.防火墙介绍 主要功能 2.防火墙常见的应用场景 3.实例操作 操作介绍 出现的问题 解决措施…

在Go语言中实现HTTP中间件

在Web开发中&#xff0c;中间件是一种非常流行的设计模式&#xff0c;它可以用于处理请求、拦截请求并对其进行处理或转换。而在Go语言中&#xff0c;实现HTTP中间件就像给自己的HTTP服务器穿上了一层“魔法外衣”&#xff0c;让它变得更加灵活、可配置和可扩展。下面&#xff…

椭球面系列---射线与椭球面的交点

射线与椭球体的交点问题的求解是一个非常常见和经典的问题&#xff0c;本文给出具体的计算原理和矩阵表达的过程&#xff0c;便于编程计算。 见下图&#xff0c;已知射线(点为 p 0 \textbf{p}_0 p0​&#xff0c;单位方向为 d \textbf{d} d)&#xff0c;那么与椭球面的交点 p …

android内存管理机制概览

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、相关概念3.1 垃圾回收3.2 应用内存的分配与回…

50个免费的 AI 工具,提升工作效率(附网址)

上次我们已经介绍了20个精选的提高工作效率的免费AI工具&#xff0c;但如果你觉得这些AI工具还不过瘾的话&#xff0c;想进一步成为职场中最了解AI的人&#xff0c;本文将汇总介绍免费最新的50个AI工具。 DeepSwap DeepSwap 是一个基于 AI 的工具&#xff0c;适用于想要制作令人…

内存之-LeakCanary

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、使用四、原理分析4.1 自动初始化4.1.1 初始化…