xml&Tomcathtml
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)開始 名稱不能包含空格 命名進儘可能簡單,見名知意
簡單元素:元素裏面包含了普通的文字面試
複雜元素:元素裏面還能夠嵌套其餘的元素服務器
定義在元素裏面,<元素名稱 屬性名稱="屬性的值"></元素名稱>dom
與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>
嚴格的講,在xml中僅有字符"<"和"&"非法的。省略號、引號和大於號都是合法的,能夠把他們替換成實體引用翻譯
< < & &
若是某段字符串裏面有過多的字符,而且裏面包含了相似標籤或者關鍵字的這種文字,不想讓xml的解析器去解析,那麼可使用CDATA來包裝,不過這個CDATA通常比較少看到,一般在服務器給客戶段返回數據的時候code
<des><!CDATA[<a=href="http://www.baidu.com">百度搜索</a>]]></des>
獲取元素裏面的字符數據或者屬性數據xml
解析方式(面試常問,有不少種經常使用種,經常使用兩種)htm
DOM:document object model把整個xml所有讀到內存當中,造成樹狀結構。整個文檔稱之爲document對象,屬性對應Attribute對象,全部的元素節點對應Element對象,文本特能夠稱之爲Text對象,以上全部對象均可以稱之爲Node節點。若是xml特別大,那麼將會形成內存溢出。能夠對文檔進行增刪操做
SAX:Simple API for Xml 基於時間驅動。讀取一行,解析一行,不會形成內存溢出,不能夠進行增刪,只能查詢
針對以上兩種解析方式的API,一些組織或者公司給出的解決方案:
jax sun公司 比較繁瑣 jdom 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是xml的路徑語言,支持在解析xml的時候,可以快速定位到具體的某一個元素
導入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(); } } }