🌟XML与JSON
✨XML语言
可扩展标记语言(可扩展:可以自定义标签名称,后续写框架时会被命名空间限制)
特性:
1.XML具有平台无关性,是一门独立的标记语言
2.xml具有自我描述性
学习xml语言主要用于写配置文件
数据传输通常使用JSON,传输速度比XML快很多
✨XML文件
XML文件是保存XML数据的一种方式
🌟XML语法格式
1.自我描述(文档声明)
2.标记名称:
自定义名称要遵循命名规范:
1)名称可以含字母,数字以及其他的字符
2)名称不能以数字或者标点符号开始
3)名称不能以字符“xml”(或者XML,Xml)开始
4)名称不能包含空格,不能包含冒号
5)名称区分大小写
如刘德华
3.一个XML文档中,必须有且仅允许有一个根标记(即最外层的标记),标记有层级称呼,中间的是子标记,最外层的是父标签,平级的是兄弟标记,标记中除了开始喝结束,还包含属性,属性内容都是一对键和值,必须由引号引住,同一个标记内的属性名之间不可以重复。
4.标记之间可以嵌套,但不能交叉
5.注释:
1)不能文档声明前面
2)注释不能嵌套注释
格式:<!— 。。。—>
6.<! [ CDATA [ 哈哈] ]>
放在CDATA里面的内容不会被解析
🌟Java解析XML
1.SAX解析:
优点:逐行加载解析,不必解析整个文档,可以立即解析加载块,节省内存,可以在某个条件得到满足时停止解析
缺点:单项解析,只读解析
2.DOM解析:一篇文章加载完才可以解析
优点:
文档在内存中加载,允许对数据和结构做出更改
访问时双向的,可以在任何时候在书中双向解析数据
3.JDOM
4.DOM4J:!重要!JDOM的一个智能分支,后续经常使用
DOM4J解析
它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath 支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项, DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一 个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML。
目前许多开源项目中大量采用DOM4J , 例如:Hibernate
🌟🌟🌟DOM4J解析XML 🏁掌握🏁
步骤:
1.引入jar文件 dom4j.jar
2.创建一个只想XML文件的输入流
FileInputStream fis = new FileInputStream(xml文件的地址);
3.创建一个xml读取工具对象
SAXReader sr new SAXReader();
4.使用读取工具对象,读取xml文档的输入流,并得到文档对象
Document doc = sr.read(fis);
5.通过文档对象,获取xml文档中的根元素对象
Element root = doc.getRootElement();
🌟🌟🌟文档对象Document
指的是加载到内存的 整个XML文档
常用方法:
1.通过文档对象,获取XML文档中的根元素对象
Element root = doc.getRootElement();
2.添加根节点
Element root= doc.addElement(“根节点名称”);
🌟🌟🌟元素对象Element
指的是xml文档中的单个节点
常用方法:
1.获取节点名称:getName();
2.获取节点内容:getText();
3.设置节点内容:setText();
4.根据子节点的名称,获取匹配名称的第一个子节点对象:
Element element (String 子节点名称);
5.获取所有子点对象
获取所有的字节点对象
List es = root.elements();
6.获取节点的属性值
book.attributeValue(“id”); //输出这本书的属性
7.获取字节点的内容
book.elementText(“name”);
book.elementText(“info”);
8.添加子节点
book.addElement(“字节点名称”);
🌟解析本地文件案例:首先配置libs
public static void main(String[] args) throws IOException, DocumentException {
//1.获取输入流
FileInputStream fis = new FileInputStream("/Users/jasmine/Desktop/Java/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”);//获取子节点book对象
Element name = book.element(“name”);//获取子节点book对象的名称
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();
}
🌟解析网络文件案例
public class Demo2 {
public static void main(String[] args) throws IOException, DocumentException {
String phone ="15001085805";
//1.获取输入流
URL url = new URL(“http://apis.juhe.cn/mobile/get?phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
//api.juhe 是一个免费提供查询的接口,可以查询天气,手机号码归属地等
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("请输入正确的手机号码");
}
Element result = root.element("result");
}
}
🌟DOM4J-XPATH解析XML
✨使用步骤
通过Node类的两个方法,来完成查找:
(Node是 Document 与 Element 的父接口)
方法1.
//根据路径表达式,查找匹配的单个节点
Element e = selectSingleNode(“路径表达式”);
方法2.
List es = selectNodes(“路径表达式”);
✨解析案例:
public class Demo1 {
public static void main(String[] args) throws IOException, DocumentException {
//1.获取输入流
FileInputStream fis = new FileInputStream("Demo1");
//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());
}
//通过文档对象XPath,查找一个name节点
Node n = doc.selectSingleNode("//book[@id='1001']//name");
System.out.println(n.getName()+":"+n.getText());
}
}
🌟Java生成XML
7步骤:
1.通过文档帮助器(DocumnetHelper),创建空的文档对象
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.writer(doc);
7.释放资源
xw.close();
🌟把Java对象转换成xml文件
Java语言先写一个类,创建了这个类的对象 p 后,
1.创建XStream对象:XStream可以快速将Java中的对象,转换为XML字符串
XStream x = new XStream();
2.修改某个类型生成的节点(可选,默认为 包名.类名)
x.alias(name:“person”,Person.class);
3.传入对象,开始生成
String xml = x.toXML§;
System.out.println(xml);
🌟JSON语言:{ }表示一个对象
对象里面可以放属性,还可以放数组,数组里面又可以放对象,如此嵌套循环
🌟Java 与 JSON
学习JSON主要将Java中的对象 快速的转换为JSON格式的字符串
将JSON格式的字符串,转换为Java的对象
✨Gson(谷歌)
🏁将对象转换为JSON字符串
步骤:
1.引入JAR包
2.在需要转换JSON字符串的位置编写如下代码即可
String son = new Gson().toJSON(要转换的对象);
代码示例:
public class Demo3 {
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);
}
}
🏁将对象转换为JSON字符串
步骤:
1.引入jar包
2.在需要转换Java对象的位置,编写如下代码:
对象 = new Gson().fromJson(JSON字符串,对象类型.class);
案例:
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());
}
如果Json文件中含有数组,转换成Java会通过ArrayList的集合形式被打印出来。
✨FastJson(阿里)
🏁将JSON字符串转为对象
案例:
//1.转换
public class Demo3_2 {
public static void main(String[] args) {
//1.转换:
Book book = JSON.parseObject(“{\”id\”:\”1002\”,\”info\”:\”床前明月光\”}”,Book.class);
System.out.println(book.getId());
}
}
🏁将JSON数组转换为Java集合
public class Demo3_2 {
public static void main(String[] args) {
//1.转换:["一二三","二三四","三四五"]
List<String> strings = JSON.parseArray("{[\"一二三\",\"二三四\",\"三四五\"]}",String.class);
System.out.println(strings.get(1));
}
}