提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
我们对一个新技术最想搞明白的一个问题就是我们为什么要学它,它能用在哪,所以在开始学习之前我们就来聊聊为什么我们要学习XML和JSON,通过了解我们可以知道XML是一种可扩展标记语言,而我们学习XML是用于网络传输的,那为什么我们要学它呢?我们java也可以通过序列化和反序列化传对象来实现呀?但是因为往往前后端的编程语言的不同我们后端的数据传到前段可能他们无法解析出来,于是人们总要通过一个前后端约定的形式来协商,这样也是十分不方便的,最终出现了XML和JSON,他们的特性便是与平台无关独立的编程语言,可以通过XML来实现网络传输完美解决了不同语言传输的难题,所以在这里我们来学习XML和JSON
提示:以下是本篇文章正文内容,下面案例可供参考
一、XML
1.简介
1.xml具有平台无关性,是一门独立的标记语言。
(平台无关性指的是不管是Windows还是苹果的操作系统xml都适用,独立的标记语言使其出色的可以用于网络编程)
2.xml具有自我描述性
(可读性强人们可以理解一般)
2.为什么学习XML
1.实现网络数据传输
2.实现数据存储
3.可以配置文件
(xml文件是保存xml数据的一种方式,xml数据也可以用其他方式存在(如在内存中构建xml数据)不要将xml语言狭义理解为xml文件)
二,XML语法格式
1.xml文档声明
<?xml version="1.0" encoding="UTF-8"?>2.标记(元素/标签/节点)
xml文档,由一个个的标记组成。
语法:
开始标记(最早台湾引进时叫开放标记):<标记名称>
结束标记(闭合标记):</标记名称>
标记名称: 自定义名称,必须遵循以下命名规范
1.名称可以含字母,数字,以及其他的字符;
2,名称不可以一数字或标点符号开始
3.名称不能以字符“xml”(或者XML)开始
4.名称不能包涵空格,不能包括冒号(:);
5.名称区别大小写
标记内容:开始标记与结束标记之间,是标记的内容。
例如,我们标记一个人名
< name > 张三< /name>
6.标记的层级称呼(子标记,父标记,后代标记,祖先标记)
例如
< persons>
< person>
< name>lisi< /name>
< lenght>180cm< /lenght>
< person>
< name>zhangsan< /name>
< lenght >200cm< /lenght>
< /person>
< /persons>
name 是person的子标记,也是person的后代标记
name是persons的后代标记
name是length的兄弟标记
person是name的父标记
persons是name的祖先标记
7.标记名称允许重复
8.标记除了开始和结束,还有属性
标记中的属性在标记开始时 描述。由属性名和属性值组成
格式:
在开始标记中描述属性
可以包涵0~n个属性,每一个属性是一个键值对!
属性名不允许重复,键值 之间用=号连接,多个属性之间使用空格分割,属性值必须被引号引住
*注意:
1.一个XML文档中必须有且仅有一个根标记
2.标记可以嵌套不可以交叉
正例
< person>
< name>doge< /name>
< age>18< /age>
< /person>
反例
< person>
< name>doge< age>< /name>(这里有交叉)
18< /age>
< /person>
1.案例
< persons>
< person id="1001" group id="1">
< name>lisi< /name>
< age> 18< /age>
< person id="1002" group id="2">
< name>lisi< /name>
< age> 18< /age>
< person>
< /persons>
9.*注释
注释不能写在文档声明前面
注释不能嵌套注释
格式:
注释开始:< !--
注释结束:-->
2.语法进阶CDATA(了解)
CDAT
CDAT是不应该由XML解析器解析的文档数据。
像“<”和“&”字符在XML元素都是非法的
“<”会产生错误,因为解析器会把该字符解释为新元素的开始
“&”会产生错误,因为解析器会把该字符解释为字符实体的开始。
某些文本,比如javaScript代码,包含大量“<”或“&”,为了避免错误可以将脚本代码定义为CDATA
CDATA部分中的所有内容都会被解析器忽略
CDATA部分由“<![CDATA["开始,由"]]>”结束:
三,java解析XML(掌握)
1.面试题*
问:java中有几种XML解析方式?分别是什么?有什么优缺点?
答:四种
1.SAX解析
解析方式是事件驱动机制!
SAX解析器,逐行读取XML文件解析,每当解析到一个标签的开始/结束/内容/属性时触发发生事件我们可以编写程序在这些事件发生时进行相应的处理
优点:
1.分析能够立即开始,而不是等待所有数据被处理
2.可以逐行加载,节省内存,有助于解析大于系统内存的文档(但是对当今电脑来说这已经不是优点了因为基本上这种情况已经不存在了)
3.有时不必解析整个文档即可以得到满足停止条件
缺点
1.单向解析,无法定位文档层次,无法同时访问同一文档的不同部分数据(因为逐行解析,当解析到第n行时,第n-1行已经被释放了,无法再进行操作了)
2.无法得知事件发生时的元素层次,只能自己维护节点的父子关系
3.只读解析方式无法修改XML文档内容
、、、、、、、、、、、、、、、、、、、、、、
2.DOM解析
是用与平台和语言无关的方式表示XML文档的官方w3
c标准,分析该结构通常需要加载整个文档和内存中建立文档树模型,程序员可以通过操作文档树,来完成数据的获取修改删除等
优点:
1.文档在内存加载,允许对数据和结构做出更改
2.访问是双向的,可以在任何时候在树中双向解析数据
缺点
文档全部加载在内存中,消耗资源大。(目前该缺点可以忽略)
,,,,,,,,,,,,,
3.JDOM解析
目的是成为java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一个java特定模型,JDM一直得到大力推广和促进
JDOM文档声明其目的是“使用20%(或更少的精力解决80%(或更多)java/XML问题)”
优点
1.使用具体类而不是接口,简化了DOM的API
2.大量使用了java集合类,方便就java开发人员
缺点:
1.没有较好的灵活性
2.性能不是那么的优越
,,,,,,,,,,,,,,,,,,,
4.DOM4J解析
他是JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持,XML Schema也支持,以及用于大文档或流行文档的基于事件的处理,它还提供了构建文档表示的选项DOM4J是一个非常优秀的java XMLAPI,具有性能优异,功能强大和极端易用的使用特点,同时它也是一个开放源代码的软件,如今你可以看到越来越多的java软件都在使用DOM4J来读写XML’
目前许多的开源项目中大量采用DOM4J,如Hibernate
2.DOM4J解析XML(掌握)
可以先自己在一个文档中写一个XML文档信息如
//1. 获取输入流
FileInputStream fis=new FileInputStream("e://text.txt");
//2. 创建mxl读取文件
SAXReader sr=new SAXReader();
//3. 读取并得到文档对象
Document doc =sr.read(fis);
//4. 通过文档获取根元素
Element root= doc.getRootElement();
//5. 开始解析元素
System.out.println(root.getName());
List<Element> es= root.elements();
for(int i=0;i<es.size();i++) {
Element book=es.get(i);
System.out.println(book.attributeValue("id"));
System.out.println(book.elementText("name"));
System.out.println(book.elementText("infore"));
System.out.println("---------");
Element book = root.element("book");
Element name = book.element("name");
System.out.println(name.getText());
}
fis.close();
3.文档对象Document
4.元素对象Element
5.解析本地文件案例(三个一起展示)
public static void main(String[] args) throws IOException {
//1. 通过文档帮助器创建一个文档对象
Document doc = DocumentHelper.createDocument();
//2. 给文档添加第一个节点(root节点)
Element books = doc.addElement("book");
//3. 通过root节点丰富子节点
for (int i = 0; i < 100; i++) {
Element book = books.addElement("book");
Element name = book.addElement("name");
name.setText("第" + i + "个金苹果");
Element infore = book.addElement("infore");
infore.setText("讲述了老农第" + i + "天种植苹果的故事");
book.addAttribute("id", 100 + i + "");
}
//4. 创建一个文档输出流
FileOutputStream fos = new FileOutputStream("e://books.xml");
//5. 将输出流转化为xml输出了
XMLWriter xw = new XMLWriter(fos);
//6.写出文档
xw.write(doc);
//7.释放资源
xw.close();
System.out.println("执行完成");
}
6.解析网络文件案例
public static void main(String[] args) throws IOException, DocumentException {
//1.获取到Xml资源的输入流
String phone="15755622806";
URL url=new URL("http://apis.juhe.cn/mobile/get? phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
URLConnection conn=url.openConnection();
InputStream is=conn.getInputStream();
//2. 创建一个xml读取对象
SAXReader sr=new SAXReader();
//3.通过读取对象读取xml数据并返回文档对象
Document doc=sr.read(is);
//4. 获取根节点
Element root=doc.getRootElement();
//5. 解析内容
String code=root.elementText("resultcode");
if("200".equals(code)){
Element result=root.element("result");
String province=result.elementText("province");
String city=result.elementText("city");
if(province.equals(city)){
System.out.println("归属地为"+city);
}else{
System.out.println("归属地为"+province+" "+city);
}
}else {
System.out.println("请输入正确的手机号码");
}
}
四.java生成XML(熟悉)
public static void main(String[] args) throws IOException {
//1. 通过文档帮助器创建一个文档对象
Document doc = DocumentHelper.createDocument();
//2. 给文档添加第一个节点(root节点)
Element books = doc.addElement("book");
//3. 通过root节点丰富子节点
for (int i = 0; i < 100; i++) {
Element book = books.addElement("book");
Element name = book.addElement("name");
name.setText("第" + i + "个金苹果");
Element infore = book.addElement("infore");
infore.setText("讲述了老农第" + i + "天种植苹果的故事");
book.addAttribute("id", 100 + i + "");
}
//4. 创建一个文档输出流
FileOutputStream fos = new FileOutputStream("e://books.xml");
//5. 将输出流转化为xml输出了
XMLWriter xw = new XMLWriter(fos);
//6.写出文档
xw.write(doc);
//7.释放资源
xw.close();
System.out.println("执行完成");
}
五,XStream的使用(了解)
public static void main(String[] args) {
Person p=new Person();
p.setAge(18);
p.setName("zhangsan");
//1.XStream使用
XStream x=new XStream();
//2.修改某个类型的节点(可选的,默认为包名.类名)
x.alias("person",Person.class);
//传入对象开始
String xml=x.toXML(p);
System.out.println(xml);
}
static public class Person{
private String name;
private int age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
六,JSON
简介:
JSON:javaScript object Notation JS对象简谱是一种轻量级的数据交换格式。
1.对象格式
一本书
书名
简介
java
class Book{
private String name;
private String info;
get/set....
js:
var b=new object();
b.name="金苹果";
b.info="老农嘿嘿嘿";
XML:
<book>
<name>金苹果</name>
<info>老农嘿嘿嘿</info>
</book>
JOSN:
{
"name":"金苹果",
"info":"老农嘿嘿嘿"
}
*注意: 一个对象,由一个大括号表示,
括号中描述对象属性.通过键值对来描述对象属性(可以理解为,大括号中,包含 的是一个个的键值对)
格式键值之间用冒号连接,多个键值对之间使用逗号分隔
键值对的键应使用引号引住(通常java解析时,键不使用引号会报错,二JS能正常解析)
键值对的值可以是JS中任意类型数据
2.数组格式
JSON格式中可以与对象相互嵌套
[元素1,元素2.。。。。]
3.案例
{
"name":"炮灰",
"age":18,
"paoyou":["张三","李四","王二麻子",{
"name":"老王",
"info":"喜欢暗中观察"
}]
}
七,java与JOSN
做什么?
1.将java中的对象快速转化为JSON格式的字符串
2.将JSON格式的字符串转化为java对象
1.Gson
public class Json {
public static void main(String[] args) {
//1. 创建一个Gson对象
Gson g=new Gson();
//2.转换
Book b=new Book(100,"金苹果","老农嘿嘿嘿");
String s=g.toJson(b);
System.out.println(s);
//3. 转换为class
Book b1=g.fromJson("{\"id\":100,\"name\":\"金苹果\",\"infore\":\"老农嘿嘿嘿\"}", Book.class);
System.out.println(b1.getInfore());
Book book =new Book(100,"金苹果","老农嘿嘿嘿");
String s1= JSON.toJSONString(book);
System.out.println(s1);
}
}
class Book{
int id;
private String name;
private String infore;
public Book(int id,String name, String infore) {
this.name = name;
this.infore = infore;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
return Objects.equals(name, book.name) && Objects.equals(infore, book.infore);
}
@Override
public int hashCode() {
return Objects.hash(name, infore);
}
public Book() {
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", infore='" + infore + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfore() {
return infore;
}
public void setInfore(String infore) {
this.infore = infore;
}
}
总结
XML和JSON的文档格式一定要记住要求会自己写全部代码一定要可以自己实现一遍时常复习