XML介绍
什么是XML
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准
XML的特性
- XML具有平台无关性, 是一门独立的标记语言.
- XML具有自我描述性
3.XML文件是保存XML数据的一种方式
4.XML数据也可以以其他的方式存在(如在内存中构建XML数据)。
XML的作用
1.XML 简化数据传输
通过 XML,可以在不兼容的系统之间轻松地交换数据。对开发人员来说,其中一项最费时的挑战一直是在因特网上的不兼容系统之间交换数据。由于可以通过各种不兼容的应用程序来读取数据,以 XML 交换数据降低了这种复杂性。
2.XML 简化数据共享
在真实的世界中,计算机系统和数据使用不兼容的格式来存储数据。XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。这让创建不同应用程序可以共享的数据变得更加容易。
3.XML 简化平台的变更
升级到新的系统(硬件或软件平台),总是非常费时的。必须转换大量的数据,不兼容的数据经常会丢失。XML 数据以文本格式存储。这使得 XML 在不损失数据的情况下,更容易扩展或升级到新的操作系统、新应用程序或新的浏览器。
4.XML 使您的数据更有用
由于 XML 独立于硬件、软件以及应用程序,XML 使您的数据更可用,也更有用。不同的应用程序都能够访问您的数据,不仅仅在 HTML 页中,也可以从 XML 数据源中进行访问。通过 XML,您的数据可供各种阅读设备使用(手持的计算机、语音设备、新闻阅读器等),还可以供盲人或其他残障人士使用
XML语法
XML文档声明
<?xml version=\”1.0\” encoding=\”UTF-8\”?>
标记
也可以称为:元素 | 标签 | 节点
XML文档,由一个个的标记组成。.开始标记(开放标记): <标记名称>结束标记(闭合标记): </标记名称>
标记名称: 自定义名称,必须遵循以下命名规则:
1.名称可以含字母、数字以及其他的字符
2.名称不能以数字或者标点符号开始
3.名称不能以字符 “xml”(或者 XML、Xml)开始
4.名称不能包含空格,不能包含冒号(:)
5.名称区分大小写
标记内容: 开始标记与结束标记之间 ,是标记的内容.
例如 ,我们通过标记, 描述一个人名:
刘歇
根标记
一个XML文档中, 必须有且且仅允许有一个根标记.
正例:
在这里插入代码片<names><name>张三</name><name>李四</name></names>
反例:
在这里插入代码片<name>李四</name><name>麻子</name>
根标记就是正例中的
<names>
</names>
标记可以嵌套, 但是不允许交叉
正例:
在这里插入代码片<person><name>李四</name><age>18</age></person>
反例:
在这里插入代码片<person><name>李四<age></name>18</age></person>
很显然,在反例中我们的
<name>
和
<age>
标记交叉了
标记的层级称呼
标记的称呼有: (子标记, 父标记 , 兄弟标记, 后代标记 ,祖先标记)
在这里插入代码片例如:<persons><person><name>李四</name><length>180cm</length></person><person><name>李四</name><length>200cm</length></person></persons>
我们通过这个例子,给大家解释一下。
name是person的子标记.也是person的后代标记
name也是是persons的后代标记.
name是length的兄弟标记.
person是name的父标记.
persons也是name的祖先标记.
你可以这么理解,其实这就是个嵌套关系,外面标记是里面标记的父标记或祖先标记,里面标记是外面标记的子标记或后代标记。同在一个嵌套的标记是兄弟标记。
标记名称 允许重复
如:
在这里插入代码片<name>张三</name><name>李四</name>
标记可以重复,就像name这个标记还可以很多很多个
标记除了开始和结束 , 还有属性
标记中的属性, 在标记开始时 描述, 由属性名和属性值 组成.
格式:
在开始标记中, 描述属性.
可以包含0-n个属性, 每一个属性是一个键值对!
属性名不允许重复 , 键与值之间使用等号连接, 多个属性之间使用空格分割.
属性值 必须被引号引住.
如:
<person id=\"10001\" groupid=\"1\"></person><person id=\"10002\" groupid=\"1\"></person>
注释
注释不能写在文档文档声明前
注释不能嵌套注释
格式:
注释开始: <!--注释结束: -->
XML解析
Java中有4种XML解析方式
1.SAX解析
解析方式是事件驱动机制 。SAX解析器, 逐行读取XML文件解析 , 每当解析到一个标签的开始/结束/内容/属性时,触发事件.
- DOM解析
是用与平台和语言无关的方式表示XML文档的官方W3C标准,分析该结构通常需要加载整个
文档和内存中建立文档树模型.程序员可以通过操作文档树, 来完成数据的获取 修改 删除等.
3.JDOM解析
目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”
4.DOM4J解析
它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML
DOM4J解析XML
由于当前DOM4J是现在的主流解析XML的方式,我们就来重点掌握一下吧。
步骤:
- 引入jar文件 dom4j.jar
.
2.创建一个指向XML文件的输入流
在这里插入代码片FileInputStream fis = new FileInputStream(\"xml文件的地址\");
3.创建一个XML读取工具对象
在这里插入代码片SAXReader sr = new SAXReader();
4.使用读取工具对象, 读取XML文档的输入流 , 并得到文档对象
在这里插入代码片Document doc = sr.read(fis);
5.通过文档对象, 获取XML文档中的根元素对象
在这里插入代码片Element root = doc.getRootElement();
文档对象 Document
它指的是加载到内存的整个XML文档.。
常用方法:
- 通过文档对象, 获取XML文档中的根元素对象
Element root = doc.getRootElement(); - 添加根节点
Element root = doc.addElement(“根节点名称”);
元素对象 Element
它指的是XML文档中的单个节点。
常用方法:
- 获取节点名称
String getName(); - 获取节点内容
String getText(); - 设置节点内容
String setText(); - 根据子节点的名称 , 获取匹配名称的第一个子节点对象.
Element element(String 子节点名称); - 获取所有的子节点对象
List elements(); - 获取节点的属性值
String attributeValue(String 属性名称); - 获取子节点的内容
String elementText(String 子节点名称); - 添加子节点
Element addElement(String 子节点名称); - 添加属性
void addAttribute(String 属性名,String 属性值);
解析XML文件的一个案例
光理解是记不住的,多敲敲吧,看到我图片的 1 2 3 4 5 了吗。那是我每次敲一遍记录下来的。
XML生成
步骤:
- 通过文档帮助器 (DocumentHelper) , 创建空的文档对象
在这里插入代码片Document doc = DocumentHelper.createDocument();
- 通过文档对象, 向其中添加根节点
在这里插入代码片Element root = doc.addElement(\"根节点名称\");
- 通过根节点对象root , 丰富我们的子节点
在这里插入代码片Element e = root.addElement(\"元素名称\");
- 创建一个文件输出流 ,用于存储XML文件
在这里插入代码片FileOutputStream fos = new FileOutputStream(\"要存储的位置\");
- 将文件输出流, 转换为XML文档输出流
在这里插入代码片XMLWriter xw = new XMLWriter(fos);
- 写出文档
在这里插入代码片xw.write(doc);
- 释放资源
在这里插入代码片xw.close();
生成XML文件的一个案例
JSON介绍
什么是 JSON
JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation),是一种轻量级的数据交换格式。
JSON 是存储和交换文本信息的语法。类似 XML。但是JSON 比 XML 更小、更快,更易解析。
JSON 具有自我描述性,更易理解
JSON的特性
JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台
JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。
JSON的用途
易于阅读和编写,同时也易于机器解析和生成。它基ECMA262语言规范(1999-12第三版)中JavaScript编程语言的一个子集。
JSON采用与编程语言无关的文本格式,但是也使用了类C语言(包括C, C++, C#, Java, JavaScript, Perl, Python等)的习惯,这些特性使JSON成为理想的数据交换格式。
Json解析
由于JSON是一种对象表示法,我在这里总结了关于它的4种解析格式
1.JSON对象——JSONObject
{\"name\":\"张三\" , \"age\":20 }
2.JSON数组——JSONArray
[{\"name\":\"张三\" , \"age\":20 },{\"name\":\"李四\" , \"age\":22}]
3.复杂一点的JSONObject
{\"name\":\"张三\" , \"age\":20,\"person\":[\"name\":\"李四\" , \"age\":22]}
4.复杂一点的JSONArray
[{\"name\":\"张三\", \"age\"=20, \"address\":{\"street\":\"岳麓山南\", \"city\":\"长沙\",\"country\":\"中国\"}},{\"name\":\"李四\", \"age\"=22, \"address\":{\"street\":\"九州港\", \"city\":\"珠海\",\"country\":\"中国\"}}]
简单说来JSON就是由一个大括号表示,括号中描述对象的属性, 通过键值对来描述对象的属性 (可以理解为, 大括号中, 包含的是一个个的键值对.)
格式:
键与值之间使用冒号连接,多个键值对之间使用逗号分隔,键值对的键应使用引号引住 (通常Java解析时, 键不使用引号会报错,而JS(JavaScript)能正确解析.)
键值对的值, 可以是JS中的任意类型的数据。
将Java中的对象 快速的转换为 JSON格式的字符串
转换JSON字符串的步骤:
-
引入JAR包
-
在需要转换JSON字符串的位置编写如下代码即可:
String json = new Gson().toJSON(要转换的对象);
将JSON字符串转换为对象
1.插入上面所说的JAR
2.在需要转换Java对象的位置, 编写如下代码:
对象 = new Gson().fromJson(JSON字符串,对象类型.class);
案例
注意:Demo3是我创建的一个对象,不要完全照我的代码写,在写之前先自己创建一个类。
XML和JSON的区别
(1)可读性方面:基本相同,XML的可读性比较好;
(2)可扩展性方面:都具有良好的扩展性;
(3)编码难度方面:相对而言,JSON的编码比较容易;
(4)解码难度:JSON的解码难度基本为零,XML需要考虑子节点和父节点;
(5)数据体积方面:JSON相对于XML来讲,数据体积小,传递的速度比较快;
(6)数据交互方面:JSON与javascript的交互更加方便,更容易解析处理,更好的数据交互;
(7)数据描述方面:XML对数据描述性比较好;
(8)传输速度方面:JSON的速度远远快于XML。
总体说来,JSON比XML要好得多。但是好像也并不差多少,各有千秋吧。XML可读性强,可读性强也很容易写。JSON对于计算机可读性强,容易提交比较小,它没有那么多标记可写,要么属性,要么值。