XMl简介:
- 1.可扩展标记语言(eXtensible Markup Language)。
特性:
1. xml具有平台无关性, 是一门独立的标记语言.
2. xml具有自我描述性 - 2. 标记 ( 元素 / 标签 / 节点)
XML文档,由一个个的标记组成.
语法:
开始标记(开放标记): <标记名称>
结束标记(闭合标记): </标记名称>
标记名称: 自定义名称,必须遵循以下命名规则:
1.名称可以含字母、数字以及其他的字符
2.名称不能以数字或者标点符号开始
3.名称不能以字符 “xml”(或者 XML、Xml)开始
4.名称不能包含空格,不能包含冒号(:)
5.名称区分大小写
标记内容: 开始标记与结束标记之间 ,是标记的内容.
例如 ,我们通过标记, 描述一个人名:
<name>张三</name> - 3. 一个XML文档中, 必须有且且仅允许有一个根标记.
正例:
<names>
<name>张三</name>
<name>李四</name>
</names>
反例:
<name>李四</name>
<name>麻子</name> - 4. 标记可以嵌套, 但是不允许交叉.
正例:
<person>
<name>李四</name>
<age>18</age>
</person>
反例:
<person>
<name>李四<age></name>
18</age>
</person> - 5. 标记的层级称呼 (子标记, 父标记 , 兄弟标记, 后代标记 ,祖先标记)
例如:
<persons>
<person>
<name>李四</name>
<length>180cm</length>
</person>
<person>
<name>李四</name>
<length>200cm</length>
</person>
</persons>
name是person的子标记.也是person的后代标记
name是persons的后代标记.
案例:
语法进阶CDATA
name是length的兄弟标记.
person是name的父标记.
persons是name的祖先标记. - 6. 标记名称 允许重复
7. 标记除了开始和结束 , 还有属性.
标记中的属性, 在标记开始时 描述, 由属性名和属性值 组成.
格式:
在开始标记中, 描述属性.
可以包含0-n个属性, 每一个属性是一个键值对!
属性名不允许重复 , 键与值之间使用等号连接, 多个属性之间使用空格分割.
属性值 必须被引号引住.
案例:
<persons>
<person id="10001" groupid="1">
<name>李四</name>
<age>18</age>
</person>
<person id="10002" groupid="1">
<name>李四</name>
<age>20</age>
</person>
</persons>
解析本地文件案例:
package com.demo; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Node; import org.dom4j.io.SAXReader; import java.io.FileInputStream; import java.io.IOException; import java.util.List; /** * @Author: 八a哥 * @Description: * @Date Created in 2022-04-15 17:24 * @Modified By: */ public class Demo04 { public static void main(String[] args) throws IOException, DocumentException { // 1.创建输入流 FileInputStream fis = new FileInputStream("E:\\data\\Demo1.xml"); // 2.创建XMl读取对象 SAXReader sr = new SAXReader(); // 3.读取并得到文档对象 Document doc = sr.read(fis); // 4.通过文档对象+xpath,查找所有的name节点 List<Node> name = doc.selectNodes("//book[@id='1001']//name"); for (int i = 0;i<name.size(); i++){ System.out.println(name.get(i).getName()); System.out.println(name.get(i).getText()); } fis.close(); } }
解析网络文件案例:
package com.demo; 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 Demo05 { public static void main(String[] args) throws DocumentException, IOException { String phone = "13375276751"; // 1.获取到xml资源的输入流 URL url = new URL("http://apis.juhe.cn/mobile/get?phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253"); URLConnection coon = url.openConnection(); InputStream is = coon.getInputStream(); // 2.创建一个xml读取对象 SAXReader sr = new SAXReader(); // 3.通过读取对象 读取xml数据 并返回文档对象 Document doc = sr.read(is); // 4.获取根节点 Element root = doc.getRootElement(); Node node = doc.selectSingleNode("//company"); System.out.println("该号码的运营商为:"+node.getText()); is.close(); } }
JSON: JavaScript Object Notation JS对象简谱 , 是一种轻量级的数据交换格式.
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":"种苹果"
}
一个对象, 由一个大括号表示.
括号中 描述对象的属性 . 通过键值对来描述对象的属性
(可以理解为, 大括号中, 包含的是一个个的键值对.)
格式:
键与值之间使用冒号连接, 多个键值对之间使用逗号分隔.
键值对的键 应使用引号引住 (通常Java解析时, 键不使用引号会报错. 而JS能正确解
析.)
键值对的值, 可以是JS中的任意类型的数据。
将JSON字符串转换为对象:
1 package com.java.demo2; 2 3 import com.google.gson.Gson; 4 5 public class Demo2 { 6 7 public static void main(String[] args) { 8 //1. 创建Gson对象 9 Gson g = new Gson(); 10 //2. 转换 : {"id":"100","name":"金苹果","info":"种植苹果真辛苦"} 11 Book b = g.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植苹果真辛苦\"}", Book.class); 12 System.out.println(b.getId()); 13 } 14 }
将JSON字符串转换为对象
1 package com.java.demo2; 2 3 import com.alibaba.fastjson.JSON; 4 5 public class Demo5 { 6 public static void main(String[] args) { 7 8 //1. 转换 : {"id":"1002","info":"床前明月光,地上鞋一堆。床上我杰哥,喊十块钱一双。","name":"唐诗三百首"} 9 Book book = JSON.parseObject("{\"id\":\"1002\",\"info\":\"床前明月光,地上鞋一堆。床上我杰哥,喊十块钱一双。\",\"name\":\"唐诗三百首\"}", Book.class); 10 System.out.println(book.getId()); 11 12 } 13 }
1 package com.java.demo2; 2 3 import com.alibaba.fastjson.JSON; 4 5 import java.util.List; 6 7 public class Demo6 { 8 public static void main(String[] args) { 9 10 //1. 转换 : ["一二三","二三四","三四五"] 11 List<String> strings = JSON.parseArray("[\"一二三\",\"二三四\",\"三四五\"]", String.class); 12 System.out.println(strings.get(1)); 13 14 } 15 }
最后我个人认为还是json更方便且流行性较高,JSON读起来更像一个数据块,读起来就比较费解了。不过,我们读起来费解的语言,恰恰是适合机器阅读。