文章目录

  • xml
  • xml语法格式
  • (面试题) java如何生成XML ?
  • Java中有几种解析方式 ?
  • DOM4J解析XML基本用法
  • 文档对象 Document (基操)
  • 元素对象 Element
  • XStream的基本使用方法
  • JSON
  • Gson(谷歌) 和FastJson (阿里)


xml

定义 =>

可扩展标记性语言 => 软件与软件交流时所使用的语言 => eg: C程序和Java程序进行交流

历史 =>

用Java的对象也是可以传输数据的

但是他有什么不好的地方呢 ?

不能跨语言, 比如说: C语言的工程师就不能拿Java的对象数据直接使用

xml可以 => 平台无关性

作用 =>

  1. 网络数据传输 => json
  2. 数据存储 => 基本不用
  3. 配置文件 => 跨平台, 任何语言工作的开发者都能够对其进行读取


使用 =>

看语法去吧~



xml语法格式
1. 文档声明
<?xml version="1.0" encoding="utf-8">

2. 标记 (直接看使用啦~ 不整那些复杂的定义呐~)
<name>阿乐</name>

3. 必须有且仅许有一个根标记
<names> //这就是根标记, 且只能出现一次, 不能重复(子标记可以)
	<name>大乐</name>
	<name>小乐</name>
</names>

4. 标记的层级称呼 (子标记, 父标记, 兄弟标记, 后代标记, 祖先标记)
就是上一代下一代的标记
<persons>                
	<person>                    
		<name>阿乐</name>                    
		<length>18cm</length>                
	</person>
</persons>
name是person的子标记, 也是person的后代标记        
name是persons的后代标记
name是length的兄弟标记

5. 标记允许重复, 根标记不允许
6. 属性(id)
<name id="1001">
	<age>18</age>
</name>

7. 注释
<!--   -->

8. 语法进阶了解 ( CDATA )
 "<" 和 "&" => XML元素中非法的元素



(面试题) java如何生成XML ?
Java中有几种解析方式 ?
  1. SAX解析 => 一行行的解析, 立即开始, 可以解析大于内存的文档, 而且读到想要的时候就能停止
    缺点:
    单向解析, 无法定位文档层次, 且逐行解析, 解析的前一行会被释放;
    无法得知层次关系;
    只能解析不能修改;
  2. DOM解析
    => 整个文章生背下来 => 建立出一个文档树模型, 可以对数据做出更改, 访问是双向的
    缺点:
    消耗资源大, 但是可以忽略不记
  3. JDOM解析 => 使用的是类而不是接口, 大量使用集合类 => 灵活性不高 => 性能不是很优异
  4. DOM4J解析 => 面向接口了, 非常非常的方便 (对于Java来说)


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 (基操)
Document => 加载到内存的整个XML文档

1. 获取根元素对象
Element root = doc.getRootElement();

2. 添加根节点
Element root = doc.addElement("Person")



元素对象 Element
1. 获取节点名称           
String getName();

2. 获取节点内容            
String getText(); 

3. 设置节点内容            
String setText(); 

4. 根据子节点的名称, 获取匹配名称的第一个子节点对象.            
Element element(String 子节点名称);    

5. 获取所有的子节点对象            
List<Element> elements();    

6. 获取节点的属性值            
String attributeValue(String 属性名称);    

7. 获取子节点的内容            
String elementText(String 子节点名称);  

8. 添加子节点           
Element addElement(String 子节点名称);

9. 添加属性          
void addAttribute(String 属性名, String 属性值)
//1. 获取文件输入流
FileInputStream fis = new FileInputStream("...");
//2. 创建XML读取工具
SAXReader sr = new SAXReader();
//3. 读取工具, 读取XML文档输入流, 得到对象
Document doc = sr.read(fis);
//4. 文档对象获取根节点
Element root = doc.getRootElement();
//5. 根节点, 获取所有子节点, 存到List当中
List<Element> es = root.elements();
for(Element e : es){
// 获取属性值使用attributeValue方法
String id = e.attributeValue("id");
//获取节点用element(), 获取内容用getText()
String name = e.element("name").getText();
}



XStream的基本使用方法
作用 =>
快速将Java中的对象转换为XML字符串

使用 =>
1. 创建 XStream 对象
    XStream x = new XStream();
2. 修改类生成的节点名称 (因为默认为 包名.类名 会很长很复杂)
	x.alias("节点名称", 类名.class);
3. 将对象转化为xml字符串 (调用toXML)
    String xml = x.toXML(b);
示例代码:

    public static void main(String[] args) {
        Book b =new Book("阿乐的故事", "讲述了阿乐成长的一生");
        //XStream => 将Java对象转化为xml字符串
        //1. 创建XStream
        XStream x = new XStream();
        //2. 修改xstream的节点名称, 你可以不更改看看它默认情况生成的是什么样子
        x.alias("book", Book.class);
        //3. 将对象转化为xml字符串 (调用toXML)
        String xml = x.toXML(b);
        System.out.println(xml);
    }

    static class Book{
        private String name;
        private String info;

        public Book(String name, String info) {
            this.name = name;
            this.info = info;
        }
    }

运行结果 =>

<book>
  <name>阿乐的故事</name>
  <info>讲述了阿乐成长的一生</info>
</book>



JSON

定义 =>

轻量级数据交换格式 (程序和程序, 客户端和程序…)

历史 =>

json将xml击败成为主流数据存储格式

解析速度更快, 更简洁, 占用内存更小, 网络传输速度更快

基本格式=>

{ "people": [

{ "firstName": "Brett", "lastName":"McLaughlin" },

{ "firstName": "Jason", "lastName":"Hunter" },

{ "firstName": "Elliotte", "lastName":"Harold" }

]}



Gson(谷歌) 和FastJson (阿里)

能够将Java对象和Json字符串相互转化的包

Gson =>
    
    1. 对象 => Json
    
   	Book b = BookDao.find(); 
    
	//new Gson().toJson();
   	String json = new Gson().toJson(b);    
   	System.out.println(json)

    2. Json => 对象
        
    String json = "{\"id\":1,\"name\":\"金苹果\",\"author\":\"李伟杰 \",\"info\":\"嘿嘿嘿嘿嘿嘿\",\"price\":198.0}";    
	
	//new Gson().fromJson();
	Book book = new Gson().fromJson(json, Book.class);
	System.out.println(book);

FastJson =>
    
    1. 对象 => Json
    
    Book b = BookDao.find();
	
	//JSON.toJSONString()
	String json=JSON.toJSONString(b);    
	System.out.println(json);
    
    2. Json => 对象
        
    String json = "{\"id\":1,\"name\":\"金苹果\",\"author\":\"李伟杰 \",\"info\":\"嘿嘿嘿嘿嘿嘿\",\"price\":198.0}";
	
	//JSON.parseObject()
	Book book = JSON.parseObject(json, Book.class); 
	System.out.println(book);