?xml超文本标记语言
XML(可扩展标记语言)语法格式
??? 1. XML文档声明, 必须在有效内容的第一行。
??? <?xml version="1.0" encoding="UTF-8" ?>
??? 2. 标记 (元素/标签/节点)
? ? ? ? ? ? 语法格式: ??????????????? XML文档,就是由一个个的标记组成的。一个标记分为开始和结束,格式如下: ??????????????? 开始标记:<标记名称> ??????????????? 结束标记:</标记名称>
??????????????? 强调: ??????????????????? 开始标记和结束标记中间的部分,我们称其为标记内容。 ??????????????????? 标记是可以嵌套的 ??????????????????? 标记名称是可以重复的。 ??????????? 标记名称(可以自定义),命名规则: ??????????????? 1. 名称可以包含字母、数字、以及其他字符 ??????????????? 2. 名称不能以数字或标点符号开头。 ??????????????? 3. 名称不能以字符xml 或 XML 或 Xml开始 ??????????????? 4. 名称不能包含空格,不能包含冒号 ??????????????? 5. 名称严格区分大小写
??????????? 示例,我们通过XML描述一个人的姓名。 ??????????????? <name>王柏</name> ??????????? 示例,我们通过XML描述一个人的年龄。 ??????????????? <age>18</age> ??????????? 示例,我们通过XML描述一个人的信息 ??????????????? <person> ??????????????????? <name>王柏</name> ??????????????????? <age>18</age> ??????????????? </person>
??? 3. 一个XML文档,有且仅有一个根标记
? ? ? ? ? ? 正例: ??????????????? <persons> ??????????????????? <person> ??????????????????????? <name>王柏</name> ??????????????????????? <age>18</age> ??????????????????? </person> ??????????????????? <person> ??????????????????????? <name>小鸣</name> ??????????????????????? <age>19</age> ??????????????????? </person> ??????????????? </persons> ??????????? 反例: ??????????????? <person> ??????????????????? <name>王柏</name> ??????????????????? <age>18</age> ??????????????? </person> ??????????????? <person> ??????????????????? <name>小鸣</name> ??????????????????? <age>19</age> ??????????????? </person>
??? 4. 标记允许嵌套,但是不允许交叉。
? ? ? ?反例: ??????????????? <persons> ??????????????????? <person> ??????????????????????? <name>王柏</name> ??????????????????? <person> ??????????????????????? <age>18</age> ??????????????????? </person> ??????????????????????? name>小鸣</name> ??????????????????? </person> ??????????????? </persons>
??? 5. 标记的层级关系(子、父、祖先、后代、兄弟)
? ? ? ? ? ? 例如: ??????????????? <persons> ??????????????????? <person> ??????????????????????? <name>王柏</name> ??????????????????????? <age>18</age> ??????????????????? </person> ??????????????????? <person> ??????????????????????? <name>小鸣</name> ??????????????????????? <age>19</age> ??????????????????? </person> ??????????????? </persons> ??????????? person是persons的子标记 ??????????? person是name标记的父标记 ??????????? persons是name标记的祖先标记 ??????????? name标记是persons的后代标记 ??????????? name是age的兄弟标记
? ? 6. 标记中的属性
? ? ? ? ? ? 属性在标记开始时描述,由一个个的属性名和属性值组成。 ??????????? 格式: ??????????????? 在开始标记中,可以包含0-n个属性,每一个属性都是一个键值对,包含了名称内容。 ??????????????? 单个标签中的属性名称不能重复,键值对的键与值之间通过等号链接,多个键值对之间通过空格分割。属性值必须被引号引住 ??????????? 例如: ??????????????? <persons> ??????????????????? <person id="1001"> ??????????????????????? <name>王柏</name> ??????????????????????? <age>18</age> ??????????????????? </person> ??????????????????? <person id="1002"> ??????????????????????? <name>小鸣</name> ??????????????????????? <age>19</age> ??????????????????? </person> ??????????????? </persons>
? ? 7 多行注释
? ? ? ? 注意:注释不能编写在文档声明之前 ??????? 注释开始:<!-- ??????? 注释结束:-->
??? 练习:描述一组书books,包含3本书book,每本书有一个id属性,和name以及description子标签。
??? 格式的进阶: ??????? 我们经常在XML描述的标签内容中,编写XML的关键符号,例如:<>
??????? 案例与解决办法: ??????? 案例:描述人的姓名时,在姓名的前面加上< 后面加上 > ??????? 解决办法1: ??????????? 通过CDATA区域来原样显示 ??????????? <person> ??????????????? <name><![CDATA[<张三>]]></name> ??????????? </person> ??????? 解决办法2: ??????????? 通过转义字符,来描述特殊符号: ??????????? <person> ???????????????? <name><张三></name> ??????????? </person>
json数据交换格式
JSON: JS对象简谱, 是JavaScript中的创建对象的方式。? 现在被大量的用于数据交换。 ?? 是一种轻量级的数据交换格式。
描述一本书: ??? book ??????? name ??????? description
Java: ??? 1. 创建类 ??? class Book{ ??????? private String name; ??????? .... ??? } ??? 2. 根据类,创建对象 ??? Book book = new Book(); ??? book.setName... ??? ...
XML: ??? <book> ??????? <name>书名</name> ??????? <description>介绍</description> ??? </book>
JS普通方式: ??? book = new Object(); ??? book.name = "书名"; ??? book.description = "介绍";
JS对象简谱方式(JSON): ??? book = { ??????? "name":"书名", ??????? "description":"介绍" ??? };
JSON语法: ??? JSON中包含两种大的格式: ??????? 1. 对象 。 2. 数组 。 对象和数组之间可以互相嵌套。 ??????? 对象的格式: ??????????? 对象本身:一个大括号{},就表示一个对象。括号中的内容是对象的属性列表。 ??????????? 属性列表:通过一个个的键值对来描述属性,单个属性的键与值通过冒号链接,多个属性之间通过逗号分割。 ??????????????????? 键值对的键,建议通过引号引住(JS中可以不引住,部分Java解析器要求必须加引号) ??????????????????? 键值对的值,可以是JS中的任意数据类型,当数据是字符串时,应通过引号引住。 ??????????? 例如: ??????????????? { ??????????????????? "name":"书名", ??????????????????? "description":"介绍" ??????????????? } ??????? 数组的格式: ??????????? 数组本身:一个中括号[],就表示一个数组。括号中是数组的元素列表。 ??????????? 元素列表: 每一个元素可以是JS中的任意数据类型,多个元素之间通过逗号分割。 ??????????? 例如: ??????????????? ["锄禾日当午","清明上河图",2,5,8,0]
??? 对象和数组之间可以互相嵌套。 ??????? 案例,描述一个人 ??????? { ??????????? "name":"小鸣", ??????????? "age":18, ??????????? "paoyou":["王柏","叶苏钦",{ ??????????????? "name":"朱永庆", ??????????????? "info":"放烟花爆竹酷爱" ??????????? }] ??????? }
综合案例篇
Demo1. Gson.jar 解析JSON字符串的案例
package com.kkb;
import com.google.gson.Gson;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Demo1 {
public static void main(String[] args) {
String json = " {\n" +
" \"name\":\"小鸣\",\n" +
" \"age\":18,\n" +
" \"paoyou\":[\"王柏\",\"叶苏钦\",{\n" +
" \"name\":\"朱永庆\",\n" +
" \"info\":\"放烟花爆竹酷爱\"\n" +
" }]\n" +
" }";
System.out.println(json);
//1.创建json解析器对象g
Gson g = new Gson();
//2.通过fromJSON(),将JSON格式字符串转为java对象,转为HashMap集合
HashMap data = g.fromJson(json, HashMap.class);
System.out.println(data.get("name"));
System.out.println(data.get("age"));
//把paoyou转换为list对象
List list = (List) data.get("paoyou");
System.out.println(list.get(0));
System.out.println(list.get(1));
Map data2 = (Map) list.get(2);
System.out.println(data2.get("name"));
}
}
Demo2. Gson.jar 将Java中对象转换为JSON字符串的案例
?book类
package com.kkb;
import java.util.Objects;
public class Book {
private String name;
private String description;
public Book(String name, String description) {
this.name = name;
this.description = description;
}
public Book() {
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", description='" + description + '\'' +
'}';
}
@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(name, book.name) && Objects.equals(description, book.description);
}
@Override
public int hashCode() {
return Objects.hash(name, description);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
?Demo2
package com.kkb;
import com.google.gson.Gson;
public class Demo2 {
public static void main(String[] args) {
Book book = new Book("金苹果","讲述了老农种植苹果的故事");
System.out.println(book);
//1. 创建解析器对象gson
Gson g = new Gson();
//2. 通过解析器的toJSON来得到JSON字符串
String json = g.toJson(book);
System.out.println(json);
}
}
Demo3. fastJson.jar 将Java中对象转换为JSON字符串的案例
package com.kkb;
import com.alibaba.fastjson.JSON;
public class Demo3 {
public static void main(String[] args) {
Book book = new Book("金苹果","讲述了老农种植苹果的故事");
System.out.println(book);
//1. 通过解析器的toJSON类的静态方法toJSONString得到JSON字符串
String json = JSON.toJSONString(book);
System.out.println(json);
}
}
Demo4. fastJson.jar 解析JSON字符串的案例
package com.kkb;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class Demo4 {
public static void main(String[] args) {
String json = "{\n" +
" \"name\":\"小鸣\",\n" +
" \"age\":18,\n" +
" \"paoyou\":[\"王柏\",\"叶苏钦\",{\n" +
" \"name\":\"朱永庆\",\n" +
" \"info\":\"放烟花爆竹酷爱\"\n" +
" }]\n" +
" }";
//1. 通过解析器,将字符串转换为对象
JSONObject map = JSON.parseObject(json);
String name = map.getString("name");
System.out.println(name);
JSONArray list = map.getJSONArray("paoyou");
System.out.println(list.getString(0));
JSONObject map2 = list.getJSONObject(2);
System.out.println(map2.getString("name"));
}
}
?
Demo5. 结合上节课所学习的URL知识,下载网络api的天气查询JSON结果,进行解析
package com.kkb;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.Scanner;
public class Demo5 {
public static void main(String[] args)throws Exception {
Scanner input = new Scanner(System.in);
System.out.println("请输入要查询天气的城市:");
String city = input.nextLine();
//URI编码的处理
city = URLEncoder.encode(city, "UTF-8");
String json = getJSON("https://itdage.cn/weather/weather?city=" + city);
JSONObject map = JSON.parseObject(json);
JSONObject resp = map.getJSONObject("resp");
JSONObject map2 = resp.getJSONObject("forecast");
JSONArray list = map2.getJSONArray("weather");
for(int i=0;i<list.size();i++){
JSONObject map3 = list.getJSONObject(i);
System.out.println(map3.getString("date"));
System.out.println(map3.getString("low")+" - "+map3.getString("high"));
JSONObject day = map3.getJSONObject("day");
JSONObject night = map3.getJSONObject("night");
System.out.println("白天天气:"+day.getString("type")+","+day.getString("fengxiang")+day.getString("fengli"));
System.out.println("夜间天气:"+night.getString("type")+","+night.getString("fengxiang")+night.getString("fengli"));
System.out.println();
}
}
public static String getJSON(String urlString) throws Exception {
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
String text = null;
StringBuilder sb = new StringBuilder();
while((text = br.readLine()) != null){
sb.append(text);
}
br.close();
return sb.toString();
}
}
版本二?
package com.kkb;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;
public class Demo8 {
public static void main(String[] args) throws Exception {
//http://apis.juhe.cn/simpleWeather/query?city=%E5%A4%AA%E5%8E%9F&key=b2a9cb5db36467550fddbbf6f3c61e0f
//1.准备一个URL的对象,来表示网址 http://apis.juhe.cn/simpleWeather/query?city=%E5%A4%AA%E5%8E%9F&key=b2a9cb5db36467550fddbbf6f3c61e0f
System.out.println("欢迎使用龙仁开发的天气预报程序,请输入您要查询的城市");
Scanner input = new Scanner(System.in);
String city = input.nextLine();
URL url = new URL("http://apis.juhe.cn/simpleWeather/query?key=b2a9cb5db36467550fddbbf6f3c61e0f&city="+city);
//2.打开网络连接,得到连接对象
URLConnection conn = url.openConnection();
//3.通过连接对象获取输入输出流
InputStream is =conn.getInputStream();
BufferedReader br =new BufferedReader(new InputStreamReader(is,"UTF-8"));
//4.通过输入流,加载内容
String jsonString =br.readLine();
JSONObject jsonObject = JSON.parseObject(jsonString);
if (jsonObject.getIntValue("errit_code")==0){
System.out.println("查询成功");
JSONObject result =jsonObject.getJSONObject("result");
JSONArray array =result.getJSONArray("future");
System.out.println("未来五天的天气情况如下");
for (int i = 0;i<array.size();i++){
JSONObject w = array.getJSONObject(i);
String date = w.getString("date");
String temperature = w.getString("temperature");
String weather = w.getString("weather");
String direct = w.getString("direct");
System.out.println(date);
System.out.println("天气:"+weather+",温度区间:"+temperature+",风向:"+direct);
System.out.println("-----------------");
}
}else {
System.out.println("查询失败,"+jsonObject.getString("reason"));
}
//5.关闭流
br.close();
}
}
?
?
Demo6. URI编码的编码与解码?
package com.kkb;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class Demo6 {
public static void main(String[] args) throws UnsupportedEncodingException {
//1. 将南京两个字,转换为URI编码
String text = URLEncoder.encode("南京", "UTF-8");
System.out.println(text);
//2. 将URI编码的南京,转换为中文
String decode = URLDecoder.decode(text, "utf-8");
System.out.println(decode);
}
}
?
|