java程序員第六課DOM&XML
1、上節內容回顧
* 表單提交方式:
- type=”submit”
- 使用button ,獲取form,使用form裏面submit()方法
* 事件 onclick onchange onfocus onblur
* xml:可擴展標記型語言(標籤是自定義的)
* xml的應用
* xml語法
- 文檔聲明:放在第一行第一列 <?xml version="1.0" encoding="utf-8"?>
- 元素定義:
** 有開始標籤也要有結束標籤
** 區分大小寫
** 不能以數字下劃線 xml.....
- 屬性定義
- 轉義字符 < > & " ,
- CDATA區:將裏面的內容作爲字符串,而不是作爲標籤
- 處理指令:設置xml的樣式
* 約束有 dtd 和 schema
* dtd約束
** 格式 <!ELEMENT 元素名稱 使用規則>
* 元素的使用規則:
** 簡單元素
- (#PCDATA)
- EMPTY
- ANY
**複雜元素
- (name,age,sex):按照順序出現
- (name|age|sex): 只能出現其中的一個
- name+:一次或者多次
- name*:任意次數
- name?:0次或者1次
* 屬性的使用規則
格式:<!ATTLIST 元素名稱
屬性名稱 屬性類型 約束
>
** 屬性類型
- CDATA
- ID:以字母和下劃線開頭
- 枚舉:每次只能出現範圍中的一個
** 約束:
- #REQUIRED
- #IMPLIED
- #FIXED "ABC"
- 直接值 "aaa"
* 在xml中引入dtd(三種)
1、使用內部dtd
2、使用外部的dtd
3、使用公共的dtd
* 定義實體
格式: <!ENTITY 實體名稱 "實體內容">
使用: &實體名稱;
* 解析xml 兩種方式 dom 和 sax
* jaxp解析xml dom方式
* jaxp是javase的一部分,是sun公司提供的解析器
2、jaxp使用sax方式解析xml
* sax方式解析的原理
- 採用事件驅動方式,邊讀邊解析
* 畫圖分析sax方式
* 需要兩部分:解析器和事件處理器
** 實現事件驅動器:繼承DefaultHandler類,重寫裏面的方法
* 使用sax方式獲取整個xml文檔
使用第一個方法裏面的參數 qName(開始標籤名稱)
使用第二個方法裏面 string構造
使用第三個方法裏面 qName(結束的標籤名稱)
* 使用sax方式獲取的某個標籤的文本內容
* 定義成員變量 flag = false
** 如果執行到想要獲取的標籤的時候,flag值ture
** 如果flag值是true時候,打印內容
* 定義一個下標
* 每次執行到結束標籤時候 下標加1
3、使用dom4j解析xml(***)
* 是一個組織dom4j組織提供的,jdom的關係
* dom4j不是javase的一部分,如果想要使用,使用提供的jar包,把jar包放到項目中
* 如何把jar包加入到項目中,
- 創建文件夾,把jar包黏貼進去
- 右鍵點擊這個jar包,build path - add to build path
- jar圖標變成奶瓶的效果
4、使用dom4j查詢xml裏面的元素
* - element(QName qName) :獲取某一個元素(第一個)
- elements(QName qName) :獲取所有元素 name
- elements() :獲取p1下面的所有元素
5、使用dom4j添加元素(末尾添加)
* 在第一個p1下面添加女
/*
* 1、獲取dom4j的解析器
* 2、執行read方法,返回document
* 3、獲取根節點
*
* 4、獲取到第一個p1
* 5、在第一個p1下面添加 直接使用addElement添加sex
* 6、向sex裏面添加內容 setText(“女”);
*
* 7、回寫xml
//格式化操作
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(“src/person.xml”), format);
xmlWriter.write(document);
//關閉
xmlWriter.close();
6、使用dom4j在特定位置添加元素
* 在女之前添加 100
* /*
* 1、獲取dom4j的解析器
* 2、執行read方法,返回document
* 3、獲取根節點
*
* 4、獲取到第一個p1
* 5、執行添加操作 elements():獲取p1下面的所有元素
* * 得到要添加的位置
* * 創建要添加的元素
* * 在p1下面執行elements方法得到p1下面的所有元素 list
* * list裏面的 add(int index, E element)
*** 創建要添加的元素 DocumentHelper類創建
* 6、回寫xml
* createPrettyPrint():表示格式化的方法
createCompactFormat():表示壓縮的方法
* */
7、使用dom4j修改元素
* 把女 修改男
* /*
* 1、獲取dom4j的解析器
* 2、執行read方法,返回document
* 3、獲取根節點
*
* 4、獲取p1
* 5、獲取p1下面的sex
* 6、完成修改操作 setText(“要修改的內容”)
* 7、回寫xml
* */
8、使用dom4j刪除元素
* 刪除第一個p1下面的360310198901018910
* /*
* 1、獲取dom4j的解析器
* 2、執行read方法,返回document
* 3、獲取根節點
*
* 4、獲取到第一個p1
* 5、獲取p1下面的id
*
* 6、執行刪除操作
* 獲取父節點: getParent()方法獲取
* 通過父節點刪除 使用remove方法刪除
* 7、回寫xml
* */
9、使用dom4j獲取屬性
* 獲取屬性值 id=”itcast”
* /*
* 1、獲取dom4j的解析器
* 2、執行read方法,返回document
* 3、獲取根節點
*
* 4、獲取到p1 element方法
* 5、獲取p1上面的屬性值 attributeValue(“屬性名稱”)
*
* */
10、dom4j對XPath的支持
* xpath:一種書寫形式,使用xpath可以直接獲取xml中某個元素
* 要想使用xpath(要想dom4j對XPath的支持),必須先要引入xpath的jar包
* 用法:
1、/AAA/DDD/BBB:按層進行獲取元素
2、//BBB:表示無論有多少層,只要名稱是BBB,都獲取到
3、*:表示所有內容
4、/AAA/BBB[1]:表示第一個BBB
/AAA/BBB[last()]:表示最後一個BBB
5、@id: 表示屬性名稱是id元素
//BBB[@id] : 表示BBB元素上面有id屬性的
6、 //BBB[@id='b1'] :表示BBB元素上面有id屬性,並且屬性值是b1
* 使用dom4j支持xpath來操作xml
- selectNodes("xpath");
- selectSingleNode("xpath");
* selectNodes("xpath");獲取xml中所有name元素的內容
* /*
* 1、獲取解析器
* 2、執行read方法,返回document
*
* 3、使用xpath獲取name元素 返回list結合
* 4、遍歷list
* 5、根據每次遍歷出來的name元素,獲取name的值
* */
* List<Node> list = document.selectNodes("//name");
* selectSingleNode("xpath");獲取第一個p1下面的name的內容
* /*
* 1、獲取解析器
* 2、執行read方法,返回document
*
* 3、使用xpath獲取第一個p1下面的name元素 //p1[@id]/name
* 4、得到的name元素,獲取內容
*
* */
* Node name1 = document.selectSingleNode("//p1[@id]/name");
11、xml的約束值schema
* 之前學習了dtd,爲什麼還要學習schema?
* dtd和schema的比較
- dtd語法