XML
可扩展标记语言Extensible markup language
- 平台无关性,独立的标记语言
- 自我描述性,可以由不同语言解析
用途: - 网络数据传输
- 数据存储
- 配置文件
存储数据:
- .xml文件方式
- 内存中构建xml数据
xml语法格式
- 自我描述 xml文档声明第一行
<?xml version="1.0" encoding="UTF-8"?>
2 标记(元素/标签/节点)- xml文档由标记组成
- 开始标记(开放标记):
<name>
- 结束标记(闭合标记):
</name>
- 命名限制 不能以数字活标点开始,不能以xml开始,区分大小写,不能含空格和冒号
- 标记内容:开始与结束标记之间
- 有且仅有一个根标记
<names><name></name></names>
(里面有多个name) - 允许嵌套不允许交叉
- 层级称呼 子/父/兄弟/后代/祖先
- 标记的属性 标记开始时描述
<name id="" groupid="">
- 注释
<!-- -->
语法进阶CDATA
不应该由xml解析器解析的文本数据(比如javascript)
<![xxxxx]>
Java如何解析xml
面试题:java有几种xml解析方式?
- SAX解析 事件驱动机制,逐行读取xml文件解析,读到标签开始/结束/内容/属性时触发事件,编写程序在事件发生时进行相应的处理
- 逐行加载,节省内存
- 单项解析,无法定位文档层次,无法同时访问不同部分数据(逐行)
- 只读,无法修改
- DOM解析 加载整个文档 内存中建立文档树模型,操作文档树
- 文件直接全部加载在内存中
- 允许对数据和结构作出修改
- 双向解析
- DOM衍生的其他方式
XPATH解析
路径表达式:通过路径快速查找元素。
/
:根开始//
:当前节点开始.
:查找当前节点..
:查找父节点@
:选择属性[@属性名=><!=‘值']
//1. 获取输入流
FileInputStream fis = new FileInputStream("");
//2. 创建xml读取对象
SAXReader sr = new SAXReader();
//3. 读取并得到文档对象
Document doc = sr.read(fis);
//4. 文档对象+xpath查找所有节点
List<Node> names = doc.selectNodes("//book[@id='100']//name");
for(int i=0;i<names.size();i++){
System.out.println(names.get(i).getName());
System.out.println(names.get(i).getText());
}
//只有一个,可以使用
doc.selectSingleNode();
fis.close();
从网址获取XML资源
//1. 获取xml资源输入流
URL url = new URL("");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
//2. 创建xml读取对象
SAXReader sr = new SAXReader();
//3. 读取对象,读取XML数据并返回文档对象
Document doc = sr.read(is);
Node node = doc.selectSingleNode("//");
DOM4J解析XML
//引入jar文件 dom4j.jar 粘贴到lib里
//project structure项目配置找lib 把sources删掉点添加,找到本项目库里的lib内容
//创建指向xml文件的输入流
FileInputStream fis = new FileInputStream("");
//创建xml读取工具对象
SAXReader sr = new SAXReader();
//读取工具对象sr读取xml文档
Document doc = sr.read(fis);
//文档对象获取根元素对象
Element root = doc.getRootElement();
//查找根所包含元素
Element book = root.element("book");
fis.close();
元素对象Element
指单个节点
- 获取名称 getName()
- 获取内容 getText()
- 设置内容 setText()
- 获取所有子节点对象 List elements()
- 获取节点属性 attributeValue(String 属性名称)
- 获取子节点内容 elementText(String 子节点名称)
- 添加子节点 addElement(子节点名称)
XML生成
- 文档帮助器DocumentHelper创建空文档对象
DocumentHelper.createDocument();
- 添加根节点
doc.addElement("");
- 添加子节点
books.addElement("");
book.addAttribute("","");
- 创建文件输出流,存储xml文件
new FileOutputStream("");
- 文件输出流转为(装饰为)xml文档输出流
new XMLWriter(fos);
- 写出到文档 xw.write();
xw.write(doc)
- 记得释放资源
xw.close();
ctrl+alt+l格式化xml
xstream.jar包提供了一个将字符串转换为xml的工具
如果有个对象要转换为xml文件
//1. 创建xstream对象
XStream x = new
//2. 修改某类型自动生成的根节点 (默认包名.类名)
x.alias("person",Person.class);//person对象的外层节点是person这个字符串,否则是包名.类名
//3. 传入对象,开始生成
String xml = x.toXML(p);
JSON
JavaScript Object Notation JS对象简谱 是一种轻量级的数据交换格式
对象格式总结
- java
class Book{
private String name;
private String info;
get/set...
}
- js
var b = new Object();
b.name = "";
b.info = "";
- XML
<book>
<name>xx</name>
<info>xxx</info>
</book>
- JSON
{
"name":"xx",
"info":"xx"
"array":["xx","xx",...,{"name":"","info":""}],
}
JSON解析jar包
Gson(谷歌的)
将对象转换为JSON字符串
- 引入jar包
- String json = new Gson().toJSON(对象);
将字符串转换为对象(字符串转对象时数组部分会转成ArrayList)
new Gson().fromJson(json,Book.class);
FastJson(阿里的)
将对象转为字符串
JSON.toJSONString(object);
字符串转为对象
JSON.parseObject(str, xx.class);
List<String> strs = JSON.parseArray("[\"......\"]",String.class);
strs.get(1);
获取下标1的数组元素