XML介绍
简介
可扩展标记语言(eXtensible Markup Language)。
特性:
- xml具有平台无关性(win mac打开一样), 是一门独立的标记语言. (单独存在也有意义,自身可以描述自身)
- xml具有自我描述性(java c javascript 解析数据也是一样的)
java是人与计算机交流的语言,XML与Json你可以理解为软件和软件交流的语言。比如A 程序员用java写客户端。B程序员用 c写服务器, 两个程序之间用什么格式交流,用xml和json交流。xml和json通常是字符串,不是文件。
为什么学习XML?
- 网络数据传输.
- 数据存储
- 配置文件
XML文件
.XML文件是保存XML数据的一种方式
XML数据也可以以其他的方式存在(如在内存中构建XML数据)。
不要将XML语言狭隘的理解成XML文件。
XML语法格式
案例:
语法进阶CDATA (了解)
Java解析XML 掌握
面试题 *
DOM4J解析XML 掌握
文档对象 Document
元素对象 Element
解析本地文件案例:
package com.java.demo1;
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.io.IOException;
import java.util.List;
public class Demo1 {
public static void main(String[] args) throws IOException, DocumentException {
//1. 获取输入流
FileInputStream fis = new FileInputStream("c://Demo1.xml");
//2. 创建XML读取对象
SAXReader sr = new SAXReader();
//3. 读取并得到文档对象
Document doc = sr.read(fis);
//4. 通过文档获取根元素
Element root = doc.getRootElement();
//5. 开始解析元素
System.out.println(root.getName());
//操作一波
//Element book = root.element("book");
//Element name = book.element("name");
//System.out.println(name.getText());
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("info"));
System.out.println("-----------------------------");
}
fis.close();
}
}
解析网络文件案例:
package com.java.demo1;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class Demo2 {
public static void main(String[] args) throws IOException, DocumentException {
String phone = "18313935565";
//1. 获取到XML资源的输入流
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("请输入正确的手机号码");
}
}
}
DOM4J - XPATH解析XML
路径表达式
使用步骤
案例1
package com.java.demo1;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
public class Demo3 {
public static void main(String[] args) throws IOException, DocumentException {
//1. 获取输入流
FileInputStream fis = new FileInputStream("c://Demo1.xml");
//2. 创建XML读取对象
SAXReader sr = new SAXReader();
//3. 读取并得到文档对象
Document doc = sr.read(fis);
//4. 通过文档对象+xpath,查找所有的name节点
/*List<Node> names = doc.selectNodes("//book[@id='1001']//name");
for (int i=0;i<names.size();i++){
System.out.println(names.get(i).getName());
System.out.println(names.get(i).getText());
}*/
Node n = doc.selectSingleNode("//book[@id='1002']//name");
System.out.println(n.getName()+":"+n.getText());
fis.close();
}
}
案例2:查找单个子节点
package com.java.demo1;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
public class Demo4 {
public static void main(String[] args) throws IOException, DocumentException {
String phone = "18313935565";
//1. 获取到XML资源的输入流
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);
Node node = doc.selectSingleNode("//company");
System.out.println("运营商:"+node.getText());
is.close();
}
}
Java生成XML
package com.java.demo1;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
public class Demo5 {
public static void main(String[] args) throws IOException {
//1. 通过文档帮助器,创建一个文档对象
Document doc = DocumentHelper.createDocument();
//2. 给文档添加第一个节点(根节点)
Element books = doc.addElement("books");
//3. 通过根节点, 丰富子节点
for(int i=0;i<100;i++){
Element book = books.addElement("book");
Element name = book.addElement("name");
name.setText(i+"种苹果的小姑娘~");
Element info = book.addElement("info");
info.setText(i+"辛勤种植苹果的故事~");
book.addAttribute("id",100+i+"");
}
//4. 创建一个文件输出流
FileOutputStream fos = new FileOutputStream("c://books.xml");
//5. 将输出流转换为XML输出流
XMLWriter xw = new XMLWriter(fos);
//6. 写出文档
xw.write(doc);
//7. 释放资源
xw.close();
System.out.println("执行完毕");
}
}
XStream 的使用 了解
package com.java.demo1;
import com.thoughtworks.xstream.XStream;
import java.util.Objects;
public class Demo6 {
public static void main(String[] args) {
Person p = new Person();
p.setName("张三");
p.setAge(18);
//XStream使用
//1、创建XStream对象
XStream x = new XStream();
//2、修改某个类型生成的节点 (可选的,默认为包名.类名)
x.alias("person",Person.class);
//3、传入对象,开始生成
String xml = x.toXML(p);
System.out.println(xml);
}
static class Person{
private String name;
private int 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;
}
public Person() {
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
}
JSON
json比xml更好写,占用空间更小,网络传输更快,所以目前都适用json。json和java没什么关系,就是当时为了蹭热度改了个名字。
对象格式
数组格式
案例
json格式如果嵌套多了以后辨识会非常困难,这里给出了一个在线网站,可以把json关系可视化。
https://www.json.cn
Gson
bean
package com.java.demo2;
import java.util.Objects;
public class Book {
private String id;
private String name;
private String info;
@Override
public String toString() {
return "Book{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", info='" + info + '\'' +
'}';
}
public Book(String id, String name, String info) {
this.id = id;
this.name = name;
this.info = info;
}
public Book() {
}
@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(id, book.id) &&
Objects.equals(name, book.name) &&
Objects.equals(info, book.info);
}
@Override
public int hashCode() {
return Objects.hash(id, name, info);
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
例子1
package com.java.demo2;
import com.google.gson.Gson;
import jdk.swing.interop.SwingInterOpUtils;
public class Demo1 {
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);*/
//1. 创建Gson对象
//2. 转换
Book b = new Book("100","金苹果","种植苹果真辛苦");
String s = new Gson().toJson(b);
System.out.println(s);
}
}
例子2
package com.java.demo2;
import com.google.gson.Gson;
public class Demo2 {
public static void main(String[] args) {
//1. 创建Gson对象
Gson g = new Gson();
//2. 转换 : {"id":"100","name":"金苹果","info":"种植苹果真辛苦"}
Book b = g.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植苹果真辛苦\"}", Book.class);
System.out.println(b.getId());
}
}
例子3
package com.java.demo2;
import com.google.gson.Gson;
import java.util.HashMap;
import java.util.List;
public class Demo3 {
public static void main(String[] args) {
//1. 创建Gson对象
Gson g = new Gson();
//2. 转换 : {"id":"100","name":"金苹果","info":"种植苹果真辛苦","page":["锄禾日当午","汗滴禾下土","嘿嘿嘿嘿嘿"]}
HashMap data = g.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植苹果真辛苦\",\"page\":[\"锄禾日当午\",\"汗滴禾下土\",\"嘿嘿嘿嘿嘿\"]}", HashMap.class);
List page = (List) data.get("page");
System.out.println(page.get(1));
}
}
FastJson
bean
package com.java.demo2;
import java.util.Objects;
public class Book {
private String id;
private String name;
private String info;
@Override
public String toString() {
return "Book{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", info='" + info + '\'' +
'}';
}
public Book(String id, String name, String info) {
this.id = id;
this.name = name;
this.info = info;
}
public Book() {
}
@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(id, book.id) &&
Objects.equals(name, book.name) &&
Objects.equals(info, book.info);
}
@Override
public int hashCode() {
return Objects.hash(id, name, info);
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
例子1
package com.java.demo2;
import com.alibaba.fastjson.JSON;
public class Demo4 {
public static void main(String[] args) {
Book book = new Book("1002","唐诗三百首","床前明月光,地上鞋一堆。床上我杰哥,喊十块钱一双。");
//1. 转换
String json = JSON.toJSONString(book);
System.out.println(json);
}
}
例子2
package com.java.demo2;
import com.alibaba.fastjson.JSON;
public class Demo5 {
public static void main(String[] args) {
//1. 转换 : {"id":"1002","info":"床前明月光,地上鞋一堆。床上我杰哥,喊十块钱一双。","name":"唐诗三百首"}
Book book = JSON.parseObject("{\"id\":\"1002\",\"info\":\"床前明月光,地上鞋一堆。床上我杰哥,喊十块钱一双。\",\"name\":\"唐诗三百首\"}", Book.class);
System.out.println(book.getId());
}
}
例子3
package com.java.demo2;
import com.alibaba.fastjson.JSON;
import java.util.List;
public class Demo6 {
public static void main(String[] args) {
//1. 转换 : ["一二三","二三四","三四五"]
List<String> strings = JSON.parseArray("[\"一二三\",\"二三四\",\"三四五\"]", String.class);
System.out.println(strings.get(1));
}
}