XML
xml是一种可扩展标记语言。
xml特点:
(1)具有平台无关性,是一门独立的标记语言。
(2)具有自我描述性。
xml作用:
可以用于网络数据传输、数据存储和配置文件。目前最普遍的作用就是配置文件,至于数据传输方面普遍被json格式替代了,因为json的速度更快。
xml语法
1、文档开头
<?xml version= "1.0" encoding="UTF-8"?>
表明了该xml文档的版本和编码格式,需要放在xml文档的开头。
2、标记
语法:<开始标记> </结束标记>
注意:标记名称不能以xml开始,不能出现空格和冒号,不能以数字或标点符号开始;标记名称区分大小写;标记名称可以含字母、数字和其它符号。
(1)xml文档中,有且仅有一个根标记,(即最外层有一个标记将内层所有标记包含在内)
(2)标记可以嵌套,但不能交叉,即开始标记和结束标记必然是成对出现的,不在在一对标记中间出现单个标记
(3)同层标记互为兄弟标记,外层标记为祖先或父标记,内层标记为后代或子标记。
(4)开始标记中可以有n个属性,属性名不可以重复,每个属性是一对键值对,属性间用空格分开,属性值必须用引号引用。
(5)注释不能写在声明文档前,不能嵌套使用,
(6)举例:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<name>张三</name>
<age>21</age>
</person>
xml解析方式
1、SAX解析
逐行读取文件进行解析,立即开始,解析到标签的开始/结束/内容/属性时,触发时间,编程时可以获取触发的事件进行相应的处理。
优点:(1)立即开始,无需等待;
(2)逐行加载,无需等待整个内存读取完毕;
(3)满足指定条件即可停止,某些时候无需加载整个文档。
缺点:(1)单向解析,无法定位文档层次,且不能同时访问同一文档中的不同部分数据;
(2)无法得知事件发生时元素的层次,只能维护结点的父子关系;
(3)只读解析方法,无法修改。
2、DOM解析
优点:(1)加载整个文档到内存,建立文档树模型,可以对数据和结构进行修改。
(2)双向解析。
缺点:文档全部加载需要耗费资源。(由于xml一般作为配置文件,占用内存小,所以缺点可以忽略不计)。
3、JDOM解析
基于DOM解析研发的第一个Java特定文档模型,简化了与xml的交互,并且更快的实现。
优点:(1)使用了具体的类而不是接口,简化了DOM的API。
(2)大量使用了Java集合类,方便了Java开发人员。
缺点:(1)灵活性一般。
(2)性能一般。
4、DOM4J解析
JDOM的一个只能分支,包括集成的XPATH支持,实现更快,操作更简单。
DOM4J-XPATH解析实例
路径表达式:
1、/ :从根节点查
2、// :从发起结点位置开始查找后代结点
3、. :查看当前结点
4、.. :查看父节点
5、@ :选择特定的属性->[@属性名=‘值’]
解析xml语法:
例: public static void main(String[] args) throws IOException, DocumentException {
//获取文件输入流
FileInputStream fis = new FileInputStream("f:\\Demo1.xml");
//创建xml读取对象
SAXReader sr = new SAXReader();
//读取并获得文档对象
Document doc = sr.read(fis);
//通过文档对象+xpath,查找所有的name对象
List<Node> list = doc.selectNodes("//book[@id='1001']//name");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getName() + ":" + list.get(i).getText());
}
}
由于上述代码只查找了id=1001的书名,因此可以改为selectSingleNode方法,该方法进行查询时,若有多个满足条件,会优先选择第一个。
生成xml格式:
例:public static void main(String[] args) throws IOException {
//1. 通过文档帮助器,创建一个文档对象
Document doc = DocumentHelper.createDocument();
//2. 给文档添加第一个结点(根节点)
Element root = doc.addElement("books");
//3. 根据根节点,丰富子节点
for (int i = 0; i < 100; i++) {
Element book = root.addElement("book");
Element name = book.addElement("name");
Element info = book.addElement("info");
name.setText(i + "种苹果");
info.setText(i + "个种苹果的小女孩");
book.addAttribute("id",100 + "" + i );
}
//4. 创建一个文件输出流
FileOutputStream fos = new FileOutputStream("books.xml");
//5. 将输出流转换为xml输出流
XMLWriter xw = new XMLWriter(fos);
//6. 写出文档
xw.write(doc);
//7. 释放资源
xw.close();
System.out.println("执行完毕!");
}
XStream生成xml格式:
例:public static void main(String[] args) {
Person p = new Person();
p.setName("张三");
p.setAge(20);
//XStream使用
//1. 创建XStream对象
XStream x = new XStream();
//2. 修改某个类型生成的结点(可选,默认情况是显示包名.类名)
x.alias("person",Person.class);
//3. 传入对象,开始生成
String xml = x.toXML(p);
System.out.println(xml); //输出xml格式的字符串
}
JSON
json:JavaScript Object Notation,JS对象简谱,一种轻量级的数据交换格式。
json语法
json语法格式:一个对象由一个大括号表示。括号中通过键值队描述对象的属性。键与值之间使用冒号连续,多个键值对之间使用逗号分隔。键值对的键应使用引号引注(通常Java解析时,键不适用引号会报错,而JS能正常解析)。键值对的值,可以是JS中的任意类型的数据(字符串、字符、数组格式)。
json解析方式
由于目前java没有内置json解析的jar包,需要使用Gson或FastJson的jar包。
1、Gson方法:
(1)创建Gson对象
(2)使用toJson方法将类的属性转换成json格式的字符串,如 例1所示。注意:数组类型的将会转换成ArrayList类型的。
(3)将json格式字符串转回对象,如例2所示。
例1:
public static void main(String[] args){
//1、创建Gson对象
Gson g= new Gson();
Person p = new Person("1001","张三",21);
String s = g.toJson(p);
//3、打印输出
System.out.println(s);
}
例2:
public static void main(String[] args){
//1、创建Gson对象
Gson g= new Gson();
//2、转换json字符串
Person p = g.fromJson("{\"id\":\"1001\",\"name\":\"张三\",\"age\":21}",Person.class);
System.out.println(p.getId());
}
2、FastJson方法
```java
例1:转json
public static void main(String[] args){
//1.创建要转换的对象
Person p = new Person("1001","张三",21);
//2.使用toJSONString()静态方法进行转换json
String json = JSON.toJSONString(p);
//3、打印输出
System.out.println(json);
}
例2:转换json格式为对象
public static void main(String[] args){
//1.将json转换成对象
Person p =JSON.parseObject("{\"id\":\"1001\",\"name\":\"张三\",\"age\":21}",Person.class);
//2、打印输出
System.out.println(p.getId());
}
例3:转换json格式为数组
public static void main(String[] args){
List<String> strings = JSON.parseArray("[\"一二三\",\"二三四\",\"三四五\"]",String.class);
System.out.println(strings.get(1));//输出集合中下标为1的值
}
本次整理了XML和JSON的一些基础语法和用法,还有一些简单的例子,由于是我本人的学习笔记,难免有不规范、不正确的地方,如果访客发现请指正!