一、XML
可扩展标记语言
1.xml语言特点:
- xml语言具有平台无关性,也就是说xml语言是一门独立的标记语言,和Java平台,C++平台或者其他平台无关。
- xml具有自我描述性,也就是说xml语言在语言中可以描述自身。
- 特别需要注意的是:xml并不局限于.xml文件,.xml文件只是xml语言应用的一种。
- java python C++等都是计算机与软件之间的语言,而xml可以说是软件与软件之间的语言。
描述自身:
<?xml version="1.0" encoding="UTF-8"?>
2.xml语言作用
- 网络数据传输
- 数据存储
- 配置文件
3.xml语法格式
- 文档声明必须放在最前面
- xml语言的核心语法是标记:
<start>...</start>
- 标记名称的限制:
- 一个xml文档必须有且只能由一个根标记,也就是最外层标记 括住整个文档
- 标记可以嵌套,但不可以交叉
- 标记名称允许重复,开始标记中可以插入属性
<start id = "N001" name = "wo">...</start>
,其中开始标记中的id就是属性,用等号将属性内容与属性名称相连,用空格间断不同的属性 - xml语言中的注释为
<!-->...<-->
4.Java解析xml
Java解析xml一共有四种方法:SAX解析、DOM解析、JDOM解析、DOM4J解析
其中DOM4J是目前功能最好效率最高的解析方法。
- 通过DOM4J解析xml
<?xml version ="1.0" encoding="UTF-8"?>
<persons>
<person1 name = "ZhangSan" >
<hobby>睡觉</hobby>
</person1>
<person2 name = "LiSi" >
<hobby>打球</hobby>
</person2>
</persons>
package com.jiansheng;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;
/**
* @author Jiansheng
*/
public class DemoXml {
public static void main(String[] args) throws FileNotFoundException, DocumentException {
//获取输入流,也就是xml数据
FileInputStream fis = new FileInputStream("D://demo.xml");
//创建一个xml读取工具对象
SAXReader sr = new SAXReader();
//使用工具对象,读取文档的输入流,并返回一个文档对象(文档对象指的是整个xml文档)
Document dc = sr.read(fis);
//通过文档对象获取根标记元素对象(元素对象指的是xml文档中的各个标记)
Element el = dc.getRootElement();
//获取根标记后就可以进行其他操作了
//通过根标记,获取所有子标记
List<Element> l = el.elements();
//循环解析所有内容
for (Element e:l) {
System.out.println(e.getName());
System.out.println(e.attributeValue("name"));
System.out.println(e.element("hobby").getText());
}
}
}
2.通过XPATH解析xml
package com.jiansheng;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;
/**
* @author Jiansheng
*/
public class DemoXml2 {
public static void main(String[] args) throws FileNotFoundException, DocumentException {
//获取输入流,也就是xml数据
FileInputStream fis = new FileInputStream("D://demo.xml");
//创建一个xml读取工具对象
SAXReader sr = new SAXReader();
//使用工具对象,读取文档的输入流,并返回一个文档对象(文档对象指的是整个xml文档)
Document dc = sr.read(fis);
//通过使用XPATH获取路径然后查找
List<Element> l = dc.selectNodes("//hobby");
for (Element e:l) {
System.out.println(e.getName());
System.out.println(e.getText());
}
}
}
XPATH解析适用于精确到每个具体的Node,针对某个Node的单独打印或其他操作
二.JSON
1.概念和特点
JavaScript Object Notation JS对象简谱 是一种轻量级的数据交换格式,完全独立于任何一门语言的文本存储语言。
2.格式
对象格式
{
“name” : “ZhangSan”,
“hobby” : “sleep”
}
- 键与值之间使用冒号连接, 多个键值对之间使用逗号分隔.
- 键值对的键 应使用双引号引住 (通常Java解析时, 键不使用引号会报错. 而JS能正确解析.)
- 键值对的值 可以是JS中的任意类型的数据
3.JSON应用(GSON)
将对象转为JSON
package com.jiansheng;
import com.google.gson.Gson;
/**
* @author Jiansheng
* 将对象转换为JSON字符串
*/
public class DemoJson1 {
public static void main(String[] args) {
//创建person对象
Person p1 = new Person("张三","睡觉");
//使用GSON创建GSON对象
Gson g = new Gson();
//将对象p1转为JSON
String jsonText = g.toJson(p1);
//打印
System.out.println(jsonText);
}
}
class Person{
private String name;
private String hobby;
public Person(String name, String hobby) {
this.name = name;
this.hobby = hobby;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
@Override
public String toString() {
return "person{" +
"name='" + name + '\'' +
", hobby='" + hobby + '\'' +
'}';
}
}
将JSON转为对象
package com.jiansheng;
import com.google.gson.Gson;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
/**
* @author Jiansheng
* 将JSON数据转为对象
*/
public class DemoJson2 {
public static void main(String[] args) throws FileNotFoundException {
FileInputStream fis = new FileInputStream("D://demo.json");
Gson g = new Gson();
Person p1 = g.fromJson(new InputStreamReader(fis),Person.class);
System.out.println(p1.getName());
System.out.println(p1.getHobby());
}
}
class Person2{
private String name;
private String hobby;
public Person2(String name, String hobby) {
this.name = name;
this.hobby = hobby;
}
public Person2() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
@Override
public String toString() {
return "person{" +
"name='" + name + '\'' +
", hobby='" + hobby + '\'' +
'}';
}
}
Jiansheng