1.XML简介
- 可扩展标记语言:意义+数据
- 标签可自行定义,具有自我描述性
- 纯文本表示,跨系统/平台/语言
- W3C标准(1998年,W3C发布了XML1.0,包括几乎所有的Unicode字符)
1 | <Student> |
XML结构
- 常规语法
- 任何的起始标签都必须有一个结束标签
- 简化写法,例如,<name></name>可以写为<name/>
- 大小写敏感,如<name>和<Name>不一样
- 每个文件都要有一个根元素
- 标签必须按合适的顺序进行嵌套,不可错位
- 所有的特性都必须有值,且在值的周围加上引号
- 需要转义字符,如“<”需要用<代替
- 注释:<!-- 注释内容 -->
XML扩展
- DTD(Document Type Definition)
- 定义 XML 文档的结构
- 使用一系列合法的元素来定义文档结构
- 可嵌套在xml文档中,或者在xml中引用
- XML Schema(XSD,XML Schema Definition)
- 定义 XML 文档的结构, DTD的继任者
- 支持数据类型,可扩展,功能更完善、强大
- 采用xml编写
- XSL
- 扩展样式表语言(eXtensible Stylesheet Language)
- XSL作用于XML,等同于CSS作用于HTML
- 内容
- XSLT: 转换 XML 文档
- XPath: 在 XML 文档中导航
- XSL-FO: 格式化XML文档
XML解析
- 树结构
- DOM: Document Object Model 文档对象模型,擅长(小规模)读/写
- 流结构
- SAX: Simple API for XML 流机制解释器(推模式),擅长读
- Stax: The Streaming API for XML 流机制解释器(拉模式),擅长读,JDK 6 引入
2.XML解析(基于DOM)
- DOM 是 W3C 处理 XML 的标准 API
- 直观易用
- 其处理方式是将 XML 整个作为类似树结构的方式读入内存中以便操作及解析,方便修改
- 解析大数据量的 XML 文件,会遇到内存泄露及程序崩溃的风险
1 | <font> |
graph TB Document---ele[Element] ele---tex[Text:whitespace] ele---name[Element] ele---tex2[Text:whitespace] ele---size[Element ] ele---tex3[Text:whitespace] name---tex4[Text:Helvetica] size---tex5[Text:36]
DOM类
- DocumentBuilder 解析类,parse方法
- Node 节点主接口,getChildNodes返回一个NodeList
- NodeList 节点列表,每个元素是一个Node
- Document 文档根节点
- Element 标签节点元素 (每一个标签都是标签节点)
- Text节点 (包含在XML元素内的,都算Text节点)
- Attr节点(每个属性节点)
读取:
1. 自上而下遍历(DFS):
1 | //DOM解析xml文件 |
2. 根据名称进行搜索
1 | //DOM解析xml文件 |
写入:
1 | DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); |
3.XML解析(基于SAX)
Simple API for XML
- 采用事件/流模型来解析 XML 文档,更快速、更轻量
- 有选择的解析和访问,不像 DOM 加载整个文档,内存要求较低
- SAX 对 XML 文档的解析为一次性读取,不创建/不存储文档对象,很难同时访问文档中的多处数据
- 推模型。当它每发现一个节点就引发一个事件,而我们需要编写这些事件的处理程序
- 关键类:DefaultHandler
1 | public class SAXReader { |
4.XML解析(基于Stax)
Streaming API for XML
- 流模型中的拉模型
- 在遍历文档时,会把感兴趣的部分从读取器中拉出,不需要引发事件,允许我们选择性地处理节点。这大大提高了灵活性,以及整体效率
- 两套处理API
- 基于指针的API, XMLStreamReader
- 基于迭代器的API,XMLEventReader
1 | public class StaxReader { |
5.JSON简介
- JavaScript Object Notation, JS 对象表示法
- 是一种轻量级的数据交换格式
- 类似XML,更小、更快、更易解析
- 最早用于Javascript中,容易解析,最后推广到全语言
- 尽管使用Javascript语法,但是独立于编程语言
JSONObject和JSONArray
- 名称/值对。如"firstName":“John”
- JSON对象:{“name":“Jo”,“email”:"a@b.com"}
- 数据在键值对中
- 数据由逗号分隔
- 花括号保存对象
- JSON数组
- 方括号保存数组
[{“name":“Jo”,“email”:"a@b.com"}, {“name":“Jo”,“email”:"a@b.com"}]
- 方括号保存数组
Java的JSON处理
- org.json:JSON官方推荐的解析类
- 简单易用,通用性强
- 复杂功能欠缺
- GSON:Google出品
- 基于反射,可以实现JSON对象、JSON字符串和Java对象互转
- Jackson:号称最快的JSON处理器
- 简单易用,社区更新和发布速度比较快
Json主要用途
- JSON生成
- JSON解析
- JSON校验
- 和Java Bean对象进行互解析
- 具有一个无参的构造函数
- 可以包括多个属性,所有属性都是private
- 每个属性都有相应的Getter/Setter方法
- Java Bean用于封装数据,又可称为POJO(Plain Old Java Object)
org.json
1 | public static void main(String[] args) { |
GSON
1 | public static void main(String[] args) { |
Jackson
1 | public static void main(String[] args) throws Exception { |
JSON vs XML
- 都是数据交换格式,可读性强,可扩展性高
- 大部分的情况下,JSON更具优势(编码简单,转换方便)
- JSON字符长度一般小于XML,传输效率更高
- XML更加注重标签和顺序
- JSON会丢失信息