Java第二十八天
xml
作用:
1. 儲存資料
2. 配置檔案
3. 資料傳輸載體
定義:就是一個檔案,字尾為.xml
文件宣告:
- 簡單宣告,version:解析這個xml的時候,使用什麼版本的解析器解析 <?xml version="1.0" ?> - encording:解析xml中的文字的時候,使用什麼解碼來翻譯 <?xml version="1.0" encording="gbk" ?> - standalone:no - 該文件會依賴關聯其他文件,yes - 這是一個獨立的文件 <?xml version="1.0" encording="gbk" standalone="no" ?>
xml命名規則:
標籤可以自定義
xml元素必須遵循以下命名規則:
名稱可以含字母、數字以及其他的字元
名稱不能以數字或者標點符號開始
名稱不能以字元“xml”(或者XML、Xml)開始
名稱不能包含空格
命名進儘量簡單,見名知意
簡單元素 & 複雜元素
簡單元素:元素裡面包含了普通的文字
複雜元素:元素裡面還可以巢狀其他的元素
屬性的定義
定義在元素裡面,<元素名稱 屬性名稱="屬性的值"></元素名稱>
xml註釋:
與html的註釋一樣,但是xml的註釋不允許放在文件的第一行,必須在文件宣告的下面
<?xml version="1.0" encoding="UTF-8"?> <!-- 這裡有兩個學生,一個叫張三一個叫李四 --> <stus> <stu id="10086"> <name>張三</name> <age>24</age> </stu> <stu d="10086"> <name>李四</name> <age>23</age> </stu> </stus>
CDATA區*非法字元
嚴格的講,在xml中僅有字元"<"和"&"非法的。省略號、引號和大於號都是合法的,可以把他們替換成實體引用
< <
& &
如果某段字串裡面有過多的字元,並且裡面包含了類似標籤或者關鍵字的這種文字,不想讓xml的解析器去解析,那麼可以使用CDATA來包裝,不過這個CDATA一般比較少看到,通常在伺服器給客戶段返回資料的時候
<des><!CDATA[<a=href="http://www.baidu.com">百度搜索</a>]]></des>
xml解析
獲取元素裡面的字元資料或者屬性資料
解析方式(面試常問,有很多種常用種,常用兩種)
DOM:document object model把整個xml全部讀到記憶體當中,形成樹狀結構。整個文件稱之為document物件,屬性對應Attribute物件,所有的元素節點對應Element物件,文字特可以稱之為Text物件,以上所有物件都可以稱之為Node節點。如果xml特別大,那麼將會造成記憶體溢位。可以對文件進行增刪操作
SAX:Simple API for Xml 基於時間驅動。讀取一行,解析一行,不會造成記憶體溢位,不可以進行增刪,只能查詢
針對以上兩種解析方式的API,一些組織或者公司給出的解決方案:
jax sun公司 比較繁瑣
jdom
dom4j 使用比較廣泛
Dom4j基本用法
匯入dom4j的jar包放在資料夾lib中buil path---add to buildpath
注意這裡如果專案前面紅色感嘆號的問題可能是匯入多餘的jar包,右鍵工程到configure到library刪除新增的jar,並把導錯的壓縮檔案刪掉,重新匯入
element.element("stu"):返回該元素下的第一個元素
element.elements:返回該元素下的所有
1. 建立SaxReader物件
2. 指定解析的xml
3. 獲取根元素
4. 根據根元素獲取子元素或者下面的子孫元素
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class MainTest {
public static void main(String[] args) {
try {
//1.建立sax讀取物件
SAXReader reader=new SAXReader();
//2.指定解析的xml源
Document ducument = reader.read("src/xml/stus.xml");
//3.得到根元素
Element rootElement = ducument.getRootElement();
/*4.得到根元素下面的子元素,根據stu標籤名得到根元素stus下面第一個stu元素,
* 再通過stu獲得下面age元素中的文字*/
System.out.println(rootElement.element("stu").element("age").getText());
//得到根元素下面的所有子元素,但不包括孫元素
List<Element> elements = rootElement.elements();
//再根據子元素獲得下面的孫元素
for (Element element:elements) {
String name = element.element("name").getText();
String age = element.element("age").getText();
System.out.println("name="+name+" age="+age);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
XPath
xpath是xml的路徑語言,支援在解析xml的時候,能夠快速定位到具體的某一個元素
- 新增jar包依賴
匯入jar包放在資料夾lib中buil path---add to buildpath
2.在查詢指定節點的時候,根據XPath語法規則來查詢(參考ZVON.org - XPath Tutorial中文手冊)
路徑以斜線 / 開始, 那麼該路徑就表示到一個元素的絕對路徑;/AAA 選擇根元素AAA ;/AAA/CCC 選擇AAA的所有CCC子元素
路徑以雙斜線 // 開頭, 則表示選擇文件中所有滿足雙斜線//之後規則的元素(無論層級關係);//BBB 選擇所有BBB元素 ;//DDD/BBB 選擇所有父元素是DDD的BBB元素
3.後續的解析程式碼一樣
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XPathTest {
public static void main(String[] args) {
try {
//1.建立sax讀取物件
SAXReader reader=new SAXReader();
//2.指定解析的xml源
Document ducument = reader.read("src/xml/stus.xml");
//3.得到根元素
Element rootElement = ducument.getRootElement();
//若想使用XPath,需要先新增jar包 ,獲取第一個,只返回一個name
Element nameElement =(Element)rootElement.selectSingleNode("//name");
System.out.println(nameElement.getStringValue());
//不論層級獲得所有的age元素的集合
List<Element> list = rootElement.selectNodes("//age");
for (Element element : list) {
System.out.println(element.getText());
}
} catch (Exception e) {
e.printStackTrace()