java核心类库——XML和JSON

 

 

一:XML

1.xml是可以种可扩展标记语言。

2.xml是一种软件与软件交流的语言,比如Java语言和C语言交流用什么样的数据格式交流更合适,目前XML和JSON是我们首选的格式

3.html和json通常指的是字符串,而不是文件。

4..xml文件是保存xml数据的一种方式,xml文件也可以由其他方式存在,如内存中构建XML数据。

5.不要将xml语言狭义的理解为xml文件。

6.特点:平台无关性;独立的一门标记语言;xml具有自我的描述性。

7.xml用在那里:

        7.1)网络数据传输 :在数据传输过程中,如果客户端一条代码要传多条性质不同的数据时,服务器在解析式容易出错,这个时候就采用一套标准的格式,这就是XML                  语言,它可以很有层次很清晰的区分一段程序的内容。(如果采用Java对象穿,弊端就是不能跨语言,就像后端式Java语言,客户端是C语言,是不能解析的。

              网络数据传输多采用JSON,他解析的速度快递。但是XML比JSON根据有阅读性,多用于文件配置这样的小数据。

       7.2)数据存储

       7.3)配置文件:比如配置数据库的账号和密码,下一次更改信息的时候,可以直接到配置文件中修改。

8.XML一般都用在配置文件上,网络编程用JSON,XML一般只用写入,不用解析他,因为在后期我们写的都是框架类的XML配置文件

 

9.xml语法格式:

1.类似于HTML语法,但是可扩展,意思就是,你想给他一个什么标签,只要语法合法,都可以。

代码演示:

 

 

 将这个文件复制到IDEA中的SRC下打开:

 

 

10.xml的解析:

10.1)xml解析的方式:

 

 

 

 

 

 

10.2)解析本地文件:

代码演示:

 1 import org.dom4j.Document;
 2 import org.dom4j.DocumentException;
 3 import org.dom4j.Element;
 4 import org.dom4j.io.SAXReader;
 5 
 6 import java.io.FileInputStream;
 7 
 8 import java.io.IOException;
 9 
10 public class Demo01 {
11     public static void main(String[] args) throws IOException, DocumentException {
12         //1.获取文件输入流
13         FileInputStream fis = new FileInputStream("D://book.xml");
14         //2.创建xml文件读取对象
15         SAXReader reader = new SAXReader();
16         //3  读取并得到文档对象
17         Document doc = reader.read(fis);
18         //4  获取文档根元素
19         Element root = doc.getRootElement();
20         //5  获取根元素的名字
21         System.out.println(root.getName());
List<Element> element = root.elements();
for(int i = 0;i<element.size();i++){
//获取到每本书
Element book = element.get(i);
//获取标签的属性名
System.out.println(book.attributeValue("id"));
//获取元素的内容
System.out.println(book.elementText("name"));
System.out.println(book.elementText("info"));
}
22  fis.close(); 23  } 24 }

 

 

 常用的方法:

 

 

 

 

 

 

 

 解析网络文件:

apis.juhe.cn/mobile/get? phone=17883172560&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253

 

 代码演示:

 1 import org.dom4j.Document;
 2 import org.dom4j.DocumentException;
 3 import org.dom4j.Element;
 4 import org.dom4j.io.SAXReader;
 5 
 6 import java.io.IOException;
 7 import java.io.InputStream;
 8 import java.io.InputStreamReader;
 9 import java.net.MalformedURLException;
10 import java.net.URL;
11 import java.net.URLConnection;
12 
13 public class Demo02 {
14     public static void main(String[] args) throws IOException, DocumentException {
15         String phone = "*****";//此处为正确形态的电话号码,可根据个人号码来填充。
16         //1  获取到XML资源的输入流
17         URL url = new URL("http://apis.juhe.cn/mobile/get? phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
18         URLConnection conn = url.openConnection();
19         InputStream is = conn.getInputStream();
20         //2  创建一个XML读取对象
21         SAXReader reader = new SAXReader();
22         //3  通过读取对象,读取XML数据,并返回文档对象
23         Document doc = reader.read(is);
24         //4  获取根节点
25         Element root = doc.getRootElement();
26         //5  解析内容
27         String code = root.elementText("resultcode");//获取根节点的内容
28         if(code.equals("200")){
29             Element result = root.element("result");//获取root的子元素
30             String province = result.elementText("province");//子元素的内容
31             String city = result.elementText("city");
32             if(province.equals(city)){
33                 System.out.println("手机归属地为:"+city);
34             }else{
35                 System.out.println("手机归属地为:"+province+" "+city);
36             }
37         }else{
38             System.out.println("请正确输入手机号");
39         }
40 
41 
42     }
43 }

 

 此处的警告是正确现象,因为我们的JDK版本过高。

 

二:DOM4J - XPATH解析XML

1.路径表达式:

使用步骤:通过路径快速的查找一个或一组元素
路径表达式:
      1. / : 从根节点开始查找
      2. // : 从发起查找的节点位置 查找后代节点 ***
      3. . : 查找当前节点
      4. .. : 查找父节点
     5. @ : 选择属性. *
属性使用方式:
[@属性名='值']
[@属性名>'值']
[@属性名<'值']
[@属性名!='值']
books: 路径: //book[@id='1']//name
books
book id=1
name
info
book id=2
name
info

代码演示:

解析本地文件:

 1 import org.dom4j.Document;
 2 import org.dom4j.DocumentException;
 3 import org.dom4j.Element;
 4 import org.dom4j.Node;
 5 import org.dom4j.io.SAXReader;
 6 
 7 import java.io.FileInputStream;
 8 import java.io.IOException;
 9 import java.util.List;
10 
11 public class Demo03 {
12     public static void main(String[] args) throws IOException, DocumentException {
13         //1.获取文件输入流
14         FileInputStream fis = new FileInputStream("D://book.xml");
15         //2.创建xml文件读取对象
16         SAXReader reader = new SAXReader();
17         //3  读取并得到文档对象
18         Document doc = reader.read(fis);
19         //4 通过文档对象+xpath,获取name节点
20         List<Node>list = doc.selectNodes("//name");
21         for(int i = 0;i<list.size();i++){
22             System.out.println(list.get(i).getName());
23             System.out.println(list.get(i).getText());
24         }
25         
26         //查找一个
27         Node node = doc.selectSingleNode("//book[@id='1001']//name");
28         System.out.println(node.getName()+" "+node.getText());
29 
30         fis.close();
31     }
32 }

解析网络文件:

 1 import org.dom4j.Document;
 2 import org.dom4j.DocumentException;
 3 import org.dom4j.Element;
 4 import org.dom4j.Node;
 5 import org.dom4j.io.SAXReader;
 6 
 7 import java.io.IOException;
 8 import java.io.InputStream;
 9 import java.net.URL;
10 import java.net.URLConnection;
11 
12 public class Demo04 {
13     public static void main(String[] args) throws IOException, DocumentException {
14         String phone = "17883172560";
15         //1  获取到XML资源的输入流
16         URL url = new URL("http://apis.juhe.cn/mobile/get? phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
17         URLConnection conn = url.openConnection();
18         InputStream is = conn.getInputStream();
19         //2  创建一个XML读取对象
20         SAXReader reader = new SAXReader();
21         //3  通过读取对象,读取XML数据,并返回文档对象
22         Document doc = reader.read(is);
23         //4
24         Node node = doc.selectSingleNode("//company");
25         System.out.println("运营商为:"+node.getText());
26     }
27 }

XPATH这种解析的方法比较直接,好用。

三:Java生成XML 熟悉

1.步骤:

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();
 
代码演示:
 1 import org.dom4j.Document;
 2 import org.dom4j.DocumentHelper;
 3 import org.dom4j.Element;
 4 import org.dom4j.io.XMLWriter;
 5 
 6 import java.io.*;
 7 
 8 public class Demo05 {
 9     public static void main(String[] args) throws IOException {
10         //1  通过文档帮助器 (DocumentHelper) , 创建空的文档对象
11         Document doc = DocumentHelper.createDocument();
12         //2  通过文档对象, 向其中添加根节点
13         Element books = doc.addElement("books");
14         for(int i = 0;i<5;i++){
15             //3  通过根节点对象root , 丰富我们的子节点
16             Element book = books.addElement("book");
17             Element name = book.addElement("name");
18             Element info = books.addElement("info");
19             name.setText("金苹果");
20             info.setText("讲诉了农民伯伯种植苹果的心酸历程");
21         }
22         //4  创建一个文件输出流 ,用于存储XML文件
23         FileOutputStream os = new FileOutputStream("D://books.xml");
24         //5  将文件输出流, 转换为XML文档输出流
25         XMLWriter xw = new XMLWriter(os);
26         //6  写出文档
27         xw.write(doc);
28         xw.close();
29     }
30 }

 

 

 

四:XStream自动生成XML文件:

1.步骤:

1). 创建XStream 对象
XStream x = new XStream();
 
2).修改类生成的节点名称 (默认节点名称为 包名.类名)
x.alias("节点名称",类名.class);
 
3). 传入对象 , 生成XML字符串
String xml字符串 = x.toXML(对象); 

2.代码演示:

 1 import com.thoughtworks.xstream.XStream;
 2 
 3 import java.util.Objects;
 4 
 5 public class Demo06 {
 6     public static void main(String[] args) {
 7 
 8         Person p = new Person();
 9         p.setName("张三");
10         p.setAge(18);
11         //XStream使用
12         //1  创建XStream对象
13         XStream xStream = new XStream();
14         //2  修改类生成的节点名称 (默认节点名称为 包名.类名)
15         xStream.alias("Person",Person.class);
16         //3  传入对象 , 生成XML字符串
17         String s = xStream.toXML(p);
18         System.out.println(s);
19 
20     }
21     static class Person{
22         private String name;
23         private int age;
24         public Person(){};
25 
26         public String getName() {
27             return name;
28         }
29 
30         public void setName(String name) {
31             this.name = name;
32         }
33 
34         public int getAge() {
35             return age;
36         }
37 
38         public void setAge(int age) {
39             this.age = age;
40         }
41 
42         @Override
43         public boolean equals(Object o) {
44             if (this == o) return true;
45             if (o == null || getClass() != o.getClass()) return false;
46             Person person = (Person) o;
47             return age == person.age &&
48                     Objects.equals(name, person.name);
49         }
50 
51         @Override
52         public int hashCode() {
53             return Objects.hash(name, age);
54         }
55 
56         @Override
57         public String toString() {
58             return "Person{" +
59                     "name='" + name + '\'' +
60                     ", age=" + age +
61                     '}';
62         }
63     }
64 }

 

 

 五:JSON介绍

1.

 

 

 

代码演示:

 1 import com.google.gson.Gson;
 2 
 3 public class Demo01 {
 4 
 5     public static void main(String[] args) {
 6 //        //1  创建一个JSON对象
 7 //        Gson g= new Gson();
 8 //        //2 创建图书对象
 9 //        Book b = new Book("100","金苹果","种植金苹果");
10 //        //3  将图书对象转换为字符串对象
11 //        String s = g.toJson(b);
12 //        System.out.println(s);
13 
14         //采用匿名内部类
15         Book b = new Book("100","金苹果","种植金苹果");
16         String s = new Gson().toJson(b);
17         System.out.println(s);
18     }
19 }

 

 

 

 1 import com.google.gson.Gson;
 2 
 3 public class Demo02 {
 4     public static void main(String[] args) {
 5         //1 创建JSON对象
 6 
 7         //将字符串转化为图书的类型
 8         Book book = new Gson().fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植金苹果\"}", Book.class);
 9         System.out.println(book.getId());
10     }
11 }
 1 import com.google.gson.Gson;
 2 
 3 import java.util.HashMap;
 4 import java.util.List;
 5 
 6 public class Demo03 {
 7     public static void main(String[] args) {
 8         //{"id":"100","name":"金苹果","info":"种植金苹果"}
 9         //1 创建JSON对象
10         Gson g = new Gson();
11         //2 将字符穿转换为Hashmap集合
12         //{"id":"100","name":"金苹果","info":"种植金苹果","page"=["锄禾日当午","汗滴禾下土","谁知盘中餐","粒粒皆辛苦"]}
13         //HashMap hashMap = g.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植金苹果\"}", HashMap.class);
14         HashMap hashMap = g.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植金苹果\",\"page\"=[\"锄禾日当午\",\"汗滴禾下土\",\"谁知盘中餐\",\"粒粒皆辛苦\"]}",HashMap.class);
15         System.out.println(hashMap.get("page").getClass());
//class java.util.ArrayList 你以为他是个数组类型,其实他是一个list集合
16 } 17 }
 1 import com.google.gson.Gson;
 2 
 3 import java.util.HashMap;
 4 import java.util.List;
 5 
 6 public class Demo03 {
 7     public static void main(String[] args) {
 8         //{"id":"100","name":"金苹果","info":"种植金苹果"}
 9         //1 创建JSON对象
10         Gson g = new Gson();
11         //2 将字符穿转换为Hashmap集合
12         //{"id":"100","name":"金苹果","info":"种植金苹果","page"=["锄禾日当午","汗滴禾下土","谁知盘中餐","粒粒皆辛苦"]}
13         //HashMap hashMap = g.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植金苹果\"}", HashMap.class);
14         HashMap hashMap = g.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植金苹果\",\"page\"=[\"锄禾日当午\",\"汗滴禾下土\",\"谁知盘中餐\",\"粒粒皆辛苦\"]}",HashMap.class);
15         List list = (List)hashMap.get("page");
16         Object o = list.get(1);
17         System.out.println(o);//汗滴禾下土
18     }

 

 

 代码演示:

对象转字符串

 1 import com.alibaba.fastjson.JSON;
 2 
 3 public class Demo04 {
 4     public static void main(String[] args) {
 5         Book b = new Book("100","金苹果","种植金苹果");
 6         //直接调用方法
 7         String s = JSON.toJSONString(b);
 8         System.out.println(s);
 9     }
10 }

字符串转对象或者数组

 1 import com.alibaba.fastjson.JSON;
 2 
 3 import java.util.List;
 4 
 5 public class Demo05 {
 6     public static void main(String[] args) {
 7         //{"id":"100","info":"种植金苹果","name":"金苹果"}
 8         //1.将字符串转换为对象
 9         Book book = JSON.parseObject("{\"id\":\"100\",\"info\":\"种植金苹果\",\"name\":\"金苹果\"}", Book.class);
10         System.out.println(book.getId());//100
11         //2.将字符串转换为数组["床前明月光","地上鞋一堆","床上我宝川","大喊十块钱一双"]
12         List<String> list = JSON.parseArray("[\"床前明月光\",\"地上鞋一堆\",\"床上我宝川\",\"大喊十块钱一双\"]", String.class);
13         System.out.println(list.get(1));
14     }
15 }

六:总结:

这张很简单,但特别的重要,要熟练掌握。

早起的鸟儿有虫吃,乱写的代码由Bug。

加油。

 

posted @ 2021-06-27 15:56  白杨树&  阅读(8)  评论(0)    收藏  举报