1. 程式人生 > >Java第二十八天

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中僅有字元"<"和"&"非法的。省略號、引號和大於號都是合法的,可以把他們替換成實體引用

<  &lt;
&  &amp;

如果某段字串裡面有過多的字元,並且裡面包含了類似標籤或者關鍵字的這種文字,不想讓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的時候,能夠快速定位到具體的某一個元素

  1. 新增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()