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 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 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.步骤:
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。
加油。


浙公网安备 33010602011771号