1-XML介紹
extendssible markup language 可擴展的標記語言
XML的作用:
- 可以用來保存數據
- 可以用來做配置文件
- 數據傳輸載體
具體的內容和功能都可以查看api來學習,很詳細
XML的倒轉樹形結構和html類似
2-XML文檔聲明
- 簡單聲明,version:解析這個xml的時候,使用什麼版本的解析
如:<?xml version=“1.0”> - encoding:解析xml中的文字時,什麼編碼存,什麼編碼解析
如:<?xml version=“1.0” encoding=“gbk”> - standalone:no - 使該文檔關聯其他的文檔
如:<?xml version="1.0" encoding="gbk" standalone="no"?>
3-XML 元素定義、屬性定義
4-XML 註釋、CDATA區
如果不加註釋,只能放在標籤中才能正常顯示,否則錯誤。此時可以加註釋解決
一般在數據傳輸的時候出現,平時比較少見到
有2個非法字符(< &)必須用轉義字符來代替
如果某段字符串裏有過多的字符,並且裏面包含了過多的標籤或者關鍵字的這種文字,不想讓xml的解析器去解析,那麼可以使用CDATA來包裝,不過這個CDATA一般比較少看到
用法:<![CDATA[內容]]>
5-XML 解析方式(DOM&SAX)
其實就是獲取元素裏面的字符數據或者屬性數據 兩種方法:DOM&SAX。DOM解析會把所有的文檔存到內存中形成樹狀結構 自上而下,解析方式有很多種,但是常用的就是這兩種:
同樣的,解析手段:jaxp,jdom,dom4j(最常用)
6-XML dom4J入門
-
創建SAXReader對象
-
指定解析的xml
-
獲取根元素
-
根據根元素獲取子元素或者下面的子孫元素
element.element(“stu”); //返回根元素下的第一個stu元素 element.elements(“stu”);
//返回根元素下的所有stu元素
具體代碼:
SAXReader sax = null;
Document dom = null;
try {
String filePath = "src/xml/demo.xml";
sax = new SAXReader();
dom = sax.read(filePath);
//返回xml文件的相對路徑
//System.out.println(dom.getName());
//獲得根元素對象的地址再獲取根元素名
//System.out.println(dom.getRootElement().getName());
//獲得Element集合(所有的stu元素),並獲取元素下的數據
List<Element> element = dom.getRootElement().elements();
for (Element element2 : element) {
System.out.print(element2.element("name").getText()+"\t");
System.out.print(element2.element("age").getText()+"\t");
System.out.print(element2.element("address").getText());
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
}
7-XML Xpath入門
遇到新知識,新對象的時候:
1.看文檔 2.及關鍵字 3.有對象先"."一下 4.看返回值 5.平時的積累
dom4j裏面支持xpath的寫法,xpath其實是xml的路徑語言,支持我們在解析xml的時候,能夠快速的定位判斷具體的某一個元素。
- 添加jar包依賴 jaxen-1.1-beta-6.jar
- 在查找指定節點的時候,根據xpath語法規則來查找
- 後續的代碼與以前的解析代碼一樣
具體代碼:
SAXReader sax = null;
Document dom = null;
try {
String filePath = "src/xml/demo.xml";
sax = new SAXReader();
dom = sax.read(filePath);
Element re = dom.getRootElement();
//要想使用Xpath,還得添加支持的jar,獲取的是第一個,只返回一個
Element nameElement = (Element)re.selectSingleNode("//name");
System.out.println(nameElement.getText());
System.out.println("--------------------");
List<Element> list = re.selectNodes("//name");
for (Element element : list) {
System.out.println(element.getText());
}
} catch (Exception e) {
e.printStackTrace();
}
8-XML XML約束
在開發過程中有的屬性和數據只能唯一,或者要受限制,所以要用約束
- DTD:一種約束的方式,但是xml解析器不能解析,並且可讀性較差,語法自成一派
- Schema:其實就是xml,使用xml的語法規則,xml解析器解析起來比較方便,但是文本內容多,所以也沒有真正意義上替代DTD
9-XML DTD
-
引入網絡上的DTD
文檔類型 根標籤名字 網絡上的dtd dtd的名稱 dtd的路徑
< !DOCTYPE stus PUBLIC “//UNKNOWN/”> “unknown.dtd”> -
引入本地的DTD
引入本地的DTD:根標籤名字 引入本地的DTD dtd的位置
< !DOCTYPE stus SYSTEM “stus.dtd”>
dtd文件代碼如下:
< !ELEMENT stus (stu)>
< !ELEMENT stu (name,age,address)>
< !ELEMENT name (#PCDATA)>
< !ELEMENT age (#PCDATA)>
< !ELEMENT address (#PCDATA)>
引入之後,xml文件中stu只能有一個,否則會錯誤 -
直接在XML裏面嵌入DTD的約束規則
xml文檔裏面直接嵌入DTD的約束法則
< !DOCTYPE stus[
< !ELEMENT stus (stu)+> stus下面有一個元素stu,但只有一個
< !ELEMENT stu (name,age)> stu下面有兩個元素name,age
< !ELEMENT name (#PCDATA)>
< !ELEMENT age (#PCDATA)>
< !ATTLIST stu id CDATA #IMPLIED> stu有一個屬性,文本類型,該屬性可有可無]>
元素的個數:+ 一個或多個 * 零個或多個 ? 零個或一個
屬性的類型:CDATA:屬性是普通文字 ID:屬性的值必須唯一
10-XML Schema
Schema的書寫,先寫元素,再逐漸寫層級
teacher.xsd:
<!-- xmlns:xml namespace:名稱空間
targetNamespace:下面定義的元素都與這個名稱空間綁定
elementFormDefault:元素的格式化情況 -->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/teacher"
xmlns:tns="http://www.example.org/teacher"
elementFormDefault="qualified">
<!-- 爲複雜元素 -->
<element name="teachers">
<complexType>
<sequence>
<!-- 爲複雜元素:默認只有一個 -->
<element name="teacher">
<complexType>
<sequence maxOccurs="unbounded">
<!-- 爲簡單元素 -->
<element name="name"></element>
<element name="age"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
teacher.xml:
<!-- xmlns:xsi:這裏必須是這樣的寫法,也就是這個值已經固定了
xmlns:這裏是名稱空間,也固定了,寫的是chema裏面的頂部目標名稱空間
xsi:schemaLocation:有兩段:前半段是名稱空間,也是目標空間的值,後面的約束文檔的路徑 -->
<teachers
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.example.org/teacher"
xsi:schemaLocation="http://www.example.org/teacher teacher.xsd">
<teacher>
<name>張三</name>
<age>28</age>
</teacher>
</teachers>
命名空間的作用:一個xml如果想綁定它的約束規則,假設使用DTD,那麼這個xml只能綁定一個DTD,不能綁定多個DTD,但是可以綁定多個Schema。
命名空間的作用就是可以綁定元素使用的約束規則,默認情況下如果使用一套規則,那麼可以這麼寫:
<name>張三</name>
<aa:name></aa:name>
<bb:name></bb:name>
11-程序架構(BS&CS)
C/S(client/server)
例如:QQ 微信 LOL…
優點:有一部分代碼寫在客戶端,用戶體驗較好
缺點:服務器更新,客戶端也隨着更新,佔用資源大
B/S(browser/server)
例如:網頁遊戲 webQQ qq郵箱…
優點:客戶端只要有瀏覽器就可以了,佔用資源小,不用更新
缺點:用戶體驗不佳
12-Web服務器
服務器就是一臺電腦,配置比一般的要好
客戶端在瀏覽器的地址欄上輸入地址,web服務器軟件,接受請求,然後響應
過程:1:安裝Tomcat 2:發佈項目到Tomcat 3:Elipse配置
13-dom4J總結
使用dom4j時,不同的層級意義:
Document doc = saxR.read("src/xml/teacher.xml");
System.out.println(doc.getName()); //此時還未進入xml,所以輸出相對路徑
Element element = doc.getRootElement();
//階段一:
System.out.println(element.getName()); //進入xml根元素,輸出根元素名
System.out.println(element.getText()); //進入xml根元素,此時兩種方法一樣
//階段二:
System.out.println(element.element("teacher").getName()); //進入teacher元素,輸出teacher
System.out.println(element.element("teacher").getText()); //進入teacher元素,但無法取出子元素,所以輸出換行符
//階段三:
System.out.println(element.element("teacher").element("name").getText());
HPF-自我總結
XML&Tomcat其實是在很早之前就學了,但是筆記一直沒有發上來。這也是之前的筆記,所以發上來做個分享,同時以後自己有什麼地方忘了也可以參考這裏的筆記。主要是做一個記錄。
因爲自己的懶惰,所以已經很長很長時間沒有繼續學習JavaWeb了,最近比較迷茫,想來想去,還是拾起JavaWeb繼續學習,我會不斷學習並且寫下學習筆記的博客的。
——— 不積跬步,無以至千里;不積小流,無以成江海。