Extensible Markup Language 可扩展标记语言
1. 存储数据
2. 配置文件
3. 在网络中传输(现在常用JSON,它的解析效率更高)
1. xml标签都是自定义的,html标签是预定义。
2. xml的语法严格,html语法松散
3. xml是存储数据的,html是展示数据
XML文档,由一个个的标记组成。
语法:
<name>Tomname>
正例:
<names>
<name>张三name>
<name>李四name>
names>
反例:
<name>张三name>
<name>李四name>
正例:
<person>
<name>张三name>
<age>18age>
person>
反例:
<person>
<name>张三<age>name>
18age>
person>
子标记,父标记,兄弟标记,后代标记,祖先标记
标记中的属性,在标记开始时描述,由属性名和属性值组成
格式:
在开始标记中描述属性
可以包含0~n个属性,每一个属性是一个键值对
属性不允许重复,键与值之间使用等号连接,多属性之间使用空格分割
属性值 必须被引号包住
案例:
<person>
<person id="1001" groupid="1">
<name>Tomname>
<age>18age>
person>
<person id="1003" groupid="1">
<name>Lucyname>
<age>20age>
person>
person>
注释开始:
实例:
哈哈]]>
约束:规定xml文档的书写规则,限制它的可扩展性
作为框架的使用者(程序员):
分类:
DTD:一种简单的约束技术Schema:一种复杂的约束技术。
引入dtd文档到xml文档中:
Schema:一种复杂的约束技术。
引入:
实例:
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.java.cn/xml student.xsd"
xmlns="http://www.java.cn/xml">
问:Java中有几种XML解析方式?分别是什么?有什么样的优缺点?
答:四种
SAX解析(Simple API For XML)
解析方式是事件驱动机制!
SAX解析器,逐行读取XML文件解析,每当解析到一个标签的开始/结束/属性/内容时,触发事件,
我们可以编写程序在这些事件发生时,进行相应的处理
优点
:
缺点
:
DOM解析(Document Object Model)
是用与平台和语言无关的方式表示XML文档的官方W3C标准,分析该结构通常需要加载整个文档和内存建立文档树模型,程序员可以通过操作文档树,来完成数据的获取,修改,删除等操作
优点
:
缺点
:
JDOM解析(Java Document Object Model)
目的是成为Java特定文档模型,它简化与XML的交互并且使用比DOM解析更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。
JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”
优点
:
缺点
:
DOM4J解析
它是JDOM的智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XMLSchema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,DOM4J是非常优秀的Java XML API,具有性能优异、功能强大和非常易于使用的特点,同时它也是一个开放源码的软件。有越来越多的Java软件都在使用DOM4J来读写XML。
目前许多开源项目中大量采用了JDOM技术,例如Hibernate
步骤:
1.引入jar文件 dom4j . jar
2.创建一个指向XML文件的输入流
3.创建一个xml读取工具对象
4.使用读取工具对象,读取XML读取文档的输入流,并得到文档对象
5.通过文档对象,获取XML文档中的根元素对象
指的是加载到内存中的 整个XML文档
常用方法:
指的是XML文档中的单个节点
常用方法:
实例1:解析本地文件
XML文件:Students.xml
<students>
<student id="1002">
<name>张三name>
<age>18age>
student>
<student id="1003">
<name>李四name>
<age>15age>
student>
<student id="1004">
<name>王二name>
<age>22age>
student>
students>
解析程序:
public static void main(String[] args) throws DocumentException, IOException {
//1. 获取文件的输入流
FileInputStream fis = new
FileInputStream("E:\\Students.xml");
//2. 创建XML读取工具对象
SAXReader sr = new SAXReader();
//3. 通过读取工具, 读取XML文档的输入流 , 并得到文档对象
Document doc = sr.read(fis);
//4. 通过文档对象 , 获取文档的根节点对象
Element root = doc.getRootElement();
//5. 通过根节点, 获取所有子节点
List<Element> es = root.elements();
//6. 循环遍历三个book
for (Element e : es) {
//1. 获取id属性值
String id = e.attributeValue("id");
//2. 获取子节点name , 并获取它的内容
String name = e.element("name").getText();
//3. 获取子节点age , 并获取它的内容
String age = e.element("age").getText();
System.out.println("id="+id+",name="+name+",age="+age);
}
fis.close();
}
实例2:解析网络文件
一个公共的手机号查询网址:“http://apis.juhe.cn/mobile/get?phone=”+phone+"&dtype=xml&key=9f3923e8f87flea50ed4ec8c39cc9253"
juhe是一个服务接口网站
,直接百度“api平台”
网络资源浏览器访问结果:
<root>
<resultcode>101resultcode>
<reason>错误的请求KEYreason>
<result/>
<error_code>10001error_code>
root>
解析程序:
public static void main(String[] args) throws IOException, DocumentException {
//1. 获取XML资源的输入流
String phone = "18516955565";
URL url = new URL("http://apis.juhe.cn/mobile/get?phone="+phone+"&dtype=xml&key=9f3923e8f87flea50ed4ec8c39cc9253");
URLConnection conn = url.openConnection();
//2. 创建一个XML读取对象
SAXReader sr = new SAXReader();
//3. 通过读取对象 读取XML数据,并返回文档对象
Document doc = sr.read(conn.getInputStream());
//4. 获取根节点
Element root = doc.getRootElement();
//5. 解析内容
List elements = root.elements();
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("请输入正确的手机号码");
}
}
原理:通过路径快速的查找一个或一组元素
路径表达式:
使用步骤
通过Node类的两个方法, 来完成查找:
(Node是 Document 与 Element 的父接口)
方法1.
//根据路径表达式, 查找匹配的单个节点
Element e = doc.selectSingleNode("路径表达式");
方法2.
List es = doc.selectNodes("路径表达式");
实例:
public static void main(String[] args) throws DocumentException, IOException {
//1. 获取文件的输入流
FileInputStream fis = new
FileInputStream("E:\\Students.xml");
//2. 创建XML读取工具对象
SAXReader sr = new SAXReader();
//3. 通过读取工具, 读取XML文档的输入流 , 并得到文档对象
Document doc = sr.read(fis);
//4. 通过文档对象+xpath,查找所有的name节点
List<Node> names = doc.selectNodes("//name");
for (int i = 0; i <names.size() ; i++) {
System.out.println(names.get(i).getName());
System.out.println(names.get(i).getText());
}
//5.查找单个对象
//5.1 用selectNodes查找
List<Node> names = doc.selectNodes("//student[@id=1003]//name");
for (int i = 0; i <names.size() ; i++) {
System.out.println(names.get(i).getName());
System.out.println(names.get(i).getText());
}
//5.2 用selectSingleNode查找(!!!推荐)
Node name = doc.selectSingleNode("//student[@id=1003]//name");
System.out.println(name.getName());
System.out.println(name.getText());
fis.close();
}
用XPath只是操作起来更简单,因为底层封装了很多方法,效率并不会提高
步骤:
1. 通过文档帮助器 (DocumentHelper) , 创建空的文档对象
Document doc = DocumentHelper.createDocument();
2. 通过文档对象, 向其中添加根节点
Element root = doc.addElement(“根节点名称”);
3. 通过根节点对象root , 丰富我们的子节点
Element e = root.addElement(“元素名称”);
4. 创建一个文件输出流 ,用于存储XML文件
FileOutputStream fos = new FileOutputStream(“要存储的位置”);
5. 将文件输出流, 转换为XML文档输出流
XMLWriter xw = new XMLWriter(fos);
6. 写出文档
xw.write(doc);
7. 释放资源
xw.close();
案例:
public static void main(String[] args) throws IOException {
//1. 通过文档帮助器 (DocumentHelper) , 创建空的文档对象
Document doc = DocumentHelper.createDocument();
//2. 通过文档对象,向其中添加根节点
Element Students = doc.addElement("Students");
//3. 向根节点中 丰富子节点
for (int i = 0; i < 100; i++) {
//向根节点中加入100个student节点
Element Student = Students.addElement("Student");
//向Student加入id属性
Student.addAttribute("id",1+i+"");
//向Student中加入name和age节点
Element name = Student.addElement("name");
Element age = Student.addElement("age");
name.setText("马保国"+1+i+"号");
age.setText("哈哈哈"+i);
}
//4. 创建文件的输入流
FileOutputStream fos = new FileOutputStream("E:\\Student1.xml");
//5. 将文件输出流转为XML文档输出流
XMLWriter xw = new XMLWriter(fos);
//6.写出文档
xw.write(doc);
//7. 释放资源
xw.close();
System.out.println("代码执行完毕");
}
作用:快速的将Java中的对象, 转换为 XML字符串
使用步骤:
1. 创建XStream 对象
XStream x = new XStream();
2. 修改类生成的节点名称 (默认节点名称为 包名.类名)
x.alias(“节点名称”,类名.class);
3. 传入对象 , 生成XML字符串
String xml字符串 = x.toXML(对象);
案例:
public static void main(String[] args) {
Student s1 = new Student("张三", 18);
Student s2 = new Student("Tom", 16);
Student s3 = new Student("老马", 58);
//1. 创建XStream对象
XStream x = new XStream();
//2. 修改生成的节点名称
x.alias("Student",Student.class);
//3.生成XML字符串
String xml = x.toXML(s1);
System.out.println(xml);
System.out.println("-----------------------------");
//生成一组对象的XML
List<Student> ss = new ArrayList<>();
x.alias("Students",List.class);
ss.add(s1);
ss.add(s2);
ss.add(s3);
String xml2 = x.toXML(ss);
System.out.println(xml2);
}
static class Student{
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
运行结果:
<Student>
<name>张三name>
<age>18age>
Student>
-----------------------------
<Students>
<Student>
<name>张三name>
<age>18age>
Student>
<Student>
<name>Tomname>
<age>16age>
Student>
<Student>
<name>老马name>
<age>58age>
Student>
Students>
简介:
JSON: JavaScript Object Notation JS对象简谱 , 是一种轻量级的数据交换格式。
百度搜索:"JSON在线视图查看工具",可以查看一个难以理解的JSON文本
eg:打开网址:sojson.com/json,然后复制JSON文本进去,就能层级显示JSON
一本书
java:
class Book{
private String name;
private String info;
get/set...
}
Book b = new Book();
b.setName(“金苹果”);
b.setInfo(“种苹果”);
...
js:
var b = new Object();
b.name = "金苹果";
b.info = "种苹果";
XML:
<book>
<name>金苹果name>
<info>种苹果info>
book>
JSON:
{
"name":"金苹果",
"info":"种苹果"
}
一个对象, 由一个大括号表示
括号中 描述对象的属性 通过键值对来描述对象的属性
(可以理解为, 大括号中, 包含的是一个个的键值对.)
格式:
在JSON格式中可以与对象互相嵌套
[元素1,元素2…]
{
"name":"马保国",
"age":58,
"friend":["张三","李四","王二","麻子",{
"name":"卢本伟",
"info":"老子从不开挂"
}],
"knife":{
"name":"大长刀",
"length":"40m"
}
}
JSON解析器:
常见的解析器:Jsonlib,Gson,fastjson,jackson
最好使用最新jar包(百度搜索Gson然后去GitHub上找,或者Maven上也有)
1. JSON转为Java对象
1.引入JAR包
2. 创建Gson对象
调用" Object obj = g.fromJson(JSON字符串,对象类型.class) ";进行转换
创建一个Student类:
public class Student {
private int id;
private String name;
private int age;
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
}
实例:
public static void main(String[] args) {
//1. 创建Gson对象
Gson g = new Gson();
//2. 转换
String str = "{\"id\":1,\"name\":\"马保国\",\"age\":56}\n";
Student student = g.fromJson(str, Student.class);
System.out.println(student);
System.out.println("---------------------------");
//3.集合转换
String str2 = "{\"id\":1,\"name\":\"马保国\",\"age\":56,\"page\":[\"hello\",\"java\",\"hahaha\"]}\n";
HashMap data = g.fromJson(str2, HashMap.class);
List page = (List) data.get("page");//JSON中的数组转出来是ArrayList
System.out.println(page.get(1));
}
运行结果:
Student{id=1, name='马保国', age=56}
----------------------------------
java
2.Java对象转换JSON
1.引入JAR包
2. 创建Gson对象
3.调用" String json = g.toJSON(要转换的对象) "进行转换
实例:
public static void main(String[] args) {
//1. 创建Gson对象
Gson g = new Gson();
//2. 转换
Student student1 = new Student(1,"马保国",56);
String str = g.toJson(student1);
System.out.println(str);
System.out.println("--------------------------------------------");
//3. 多个对象转换
Student student2 = new Student(2,"卢本伟",28);
Student student3 = new Student(3,"蔡徐坤",15);
ArrayList<Student> students = new ArrayList<>();
students.add(student1);
students.add(student2);
students.add(student3);
String str2 = g.toJson(students);
System.out.println(str2);
}
运行结果:
{"id":1,"name":"马保国","age":56}
--------------------------------------------
[{"id":1,"name":"马保国","age":56},{"id":2,"name":"卢本伟","age":28},{"id":3,"name":"蔡徐坤","age":15}]
最好使用最新jar包(百度搜索Gson然后去GitHub上找,或者Maven上也有)
1. JSON转为Java对象
1.引入JAR包
2.在需要转换Java对象的位置, 编写如下代码:
实例:
public class Demo4 {
public static void main(String[] args) {
String str = "{\"id\":1,\"name\":\"马保国\",\"age\":56}";
Student student = JSON.parseObject(str, Student.class);
System.out.println(student);
}
}
运行结果:
Student{id=1, name='马保国', age=56}
2.Java对象转换JSON
1.引入JAR包
2.在需要转换JSON字符串的位置编写如下代码即可:
实例:
public static void main(String[] args) {
Student student1 = new Student(1,"马保国",56);
String str = JSON.toJSONString(student1);
System.out.println(str.length());
}
运行结果:
{"id":1,"name":"马保国","age":56}
注意:
FastJson是靠对象属性的get、Set方法生成josn文件的,没有get、set方法无法生成
1. JSON转为Java对象
1.导入jackson的相关jar包
2.创建Jackson核心对象 ObjectMapper
3.调用ObjectMapper的相关方法进行转换
2. Java对象转换JSON
使用步骤:
1.导入jackson的相关jar包
2.创建Jackson核心对象 ObjectMapper
3.调用ObjectMapper的相关方法进行转换
1.转换方法:
writeValue(参数1,obj):
参数1:
File:将obj对象转换为JSON字符串,并保存到指定的文件中
Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
writeValueAsString(obj):将对象转为json字符串
2.注解:
3.复杂java对象转换