Java第二十八天

xml&Tomcathtml

xml

做用:

1.  保存數據
2.  配置文件
3.  數據傳輸載體

定義:就是一個文件,後綴爲.xmljava

文檔聲明:

- 簡單聲明,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)開始
		名稱不能包含空格
	命名進儘可能簡單,見名知意

簡單元素 & 複雜元素

簡單元素:元素裏面包含了普通的文字面試

複雜元素:元素裏面還能夠嵌套其餘的元素服務器

屬性的定義

定義在元素裏面,<元素名稱 屬性名稱="屬性的值"></元素名稱>dom

xml註釋:

與html的註釋同樣,可是xml的註釋不容許放在文檔的第一行,必須在文檔聲明的下面ui

<?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通常比較少看到,一般在服務器給客戶段返回數據的時候code

<des><!CDATA[<a=href="http://www.baidu.com">百度搜索</a>]]></des>

xml解析

獲取元素裏面的字符數據或者屬性數據xml

解析方式(面試常問,有不少種經常使用種,經常使用兩種)htm

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();
			}
	}
}
相關文章
相關標籤/搜索