/*
* Extensible Markup Language,可擴展標記語言,W3C開發 2000年1.0至今
* 存儲帶有結構性數據,一種數據存儲格式
* 利用標籤保存數據
* 開始標籤&&結束標籤,每一段標籤描述一段數據,可以嵌套
* 對於人和計算機都非常友好
* 本質:就是一段字符串
* 應用主要兩點:
* 1.在不同系統不同語言之間進行數據傳輸,具有跨平臺特性
* 2.作爲配置文件來使用。(properties,只能存儲鍵值數據,沒有層級結構)
*
* XML文件:
* 將符合xml語法格式的數據存儲於一個文件中,通常後綴名爲.xml,就得到了一個存儲XML數據的
* XML文件。
* XML校驗:瀏覽器除了可以處理和展示html格式的數據,還可以處理XML格式的數據,
* 如果瀏覽器可以打開XML格式數據,則正確,否則錯誤。
* 瀏覽器可以分析出XML其中的是數據結構。瀏覽器可以校驗並顯示問題所在。
*
* 二、XML語法
* 文檔聲明
* 元素
* 屬性
* 註釋
* CDATA區,特殊字符
* 處理指令(processing instruction)
*
*
* 1.文檔聲明格式:
* 通常是用來聲明文檔的屬性的,必須放在文檔的第一行,第一行不能有其他內容。
* 第一種寫法:version是必須寫的,用來聲明實用的那個版本的XML,XML必須有且僅有一個根標籤
* <?xml version="1.0" ?>
* 第二種寫法:encoding 編碼格式,用來解決文檔亂碼問題。
* <?xml version="1.0" encoding = "utf-8"?>
* 第三種寫法:standalone 用來聲明XML文檔是否是一個獨立文檔,可以取值爲yes表示是一個獨立文檔,
* 也可以取值no 表示依賴於其他文檔
* <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
*
* 2.元素:一個標籤就是一個XML元素
* <開始標籤>標籤體</結束標籤>
* 如果一個標籤內部,沒有標籤體+任何子標籤,則該標籤的標籤體和子標籤可以合併,爲<a/>
* <a></a> ---> 簡寫爲:<a/> --->自閉標籤
* 一個標籤可以嵌套若干子標籤,但必須合理嵌套,不能交叉嵌套。
* 一個格式良好的XML文件有且僅有一個根標籤,其他標籤均爲其子孫標籤。
*
* 元素區分大小寫,<P>與<p>不一樣
* 不能以數字,標點符號,下劃線_,xml(或XML,Xml)開頭,
* 不能包含空格,
* 名稱中間本能包含冒號(:);
* 3.屬性:
* 一個xml元素可以具有0個或多個屬性,屬性是由屬性名和屬性值組成,屬性名和屬性值之間用=連接,
* 屬性的值應該用單引號和雙引號引起來。
* <? xml version="1.0" encoding="gbk" standalone="yes" ?>
* <中國 capital="北京" flag="五星紅旗"></中國>
*
* 命名規範同上。
* 4.註釋:
* <!--註釋內容-->
* 注意:註釋不能嵌套註釋;
* 註釋不能寫在文檔聲明之前,因爲文檔聲明必須處在整個文檔最前面,之前不能有任何內容,
* 包括文檔註釋。
* 例1:
* <? xml version="1.0" encoding="gbk" standalone="yes" ?>
* <!--這是註釋內容-->
* <中國 capital="北京" flag="五星紅旗"></中國>
*
* 例2:
* <? xml version="1.0" encoding="gbk" standalone="yes" ?>
* <person>
* <name></name>
* <age></age>
* </person>
*
* 5.CDATA區,轉義字符
* 轉義字符:
* 如果文檔中普通字符中包含了一些特殊字符,導致解析引擎解析出現問題,可以通過轉義字符進行轉義
* < --> <
* > --> >
* & --> &
* " --> "
* ' --> '
* 轉義字符適用於需要轉義內容比較少的情況,如果需要將一大段內容進行轉義可以使用CDATA區進行。
* CDATA區:
* <![CDATA[
* 需要轉義內容
* ]]>
* CDATA區適用於將一大段內容進行轉義,好處可以處理一大段內容,不需要將內容中每一個內容進行
* 單一處理;
* 例如:
* <? xml version="1.0" encoding="gbk" standalone="yes" ?>
* <person>
* <name>張<name></name>
* <age>20</age>
* <code>
* <![CDATA[
* class Dog{
* public void eat(){
* String name = "狗仔";
* int i = 10;
* if(i<s){
* ....
* }
* }
* }
* ]]>
* </code>
* </person>
* 6.處理指令:xml中的處理指令用來通知解析引擎如何來解析xml 中的其他部分內容
* <?處理指令的名稱 若干屬性 ?>---很少用!
* html+css --html5--前端開發工程師
* xml+xslt+css(w3c想推廣,但受到開發人員抵制,推廣不開)
*
* 例如:
* <?xml-stylesheet href="" type="" standalone="no" ?>
* 例如:
* <? xml version="1.0" encoding="gbk" ?>
* <? xml-stylesheet type="text/css" href="1.css" ?>
* <country>
* <aa>中國</aa>
* <bb>美國</bb>
* <cc>法國</cc>
* <dd>俄羅斯</dd>
* </country>
*
* 1.css:
* aa{
* color:red;
* font-size:500px;
* }
*
* bb{
* color:blue;
* font-size:400px;
* }
* cc{
* color:green;
* font-size:200px;
* }
* dd{
* color:yellow;
* font-size:50px;
* }
*
*
* 三、xml約束
* 一個xml的寫法可以用另一個文件來進行約束,這樣的技術成爲xml的約束技術
* 框架程序:框架如何運行有配置文件指定 太靈活了,產生問題。框架設計者寫一個約束文件
* 應用:
* 1.xml約束技術可以用來約束xml文件寫法,
* 2.寫出xml文件也可以通過xml的約束文件進行校驗
*
* 兩種:--要求看的懂約束文件,不要求會寫。(高級開發人員要會寫)
* dtd 語法簡單,容易學習,功能較弱
* schema 語法強大,可以實現語意級別的約束,語法複雜,學習成本高
*
* 1.DTD(Document Type Definition),全程爲文檔類型定義。
* DTD文件必須爲utf-8編碼,否則報錯。
* 默認情況下,瀏覽器並沒有開啓dtd校驗,不能用瀏覽器來校驗xml是否符合dtd約束,
* 可以用JavaScript語法來校驗。
* 其實還有更簡單方法,我們的eclipse和Myeclipse都可以來進行dtd校驗。
*
* 在xml中引入DTD:
* 引入外部文件:
* 可以在外部文件中寫好dtd,在xml內部通過標籤進行引入操作,
* 引入本地文件:
* <!DOCUMENT 根元素的名稱 SYSTEM "dtd文件位置">
* 引入網絡公共位置文件:
* <!DOCUMENT 文檔的根結點 PUBLIC "DTD名稱" "DTD文件的URL">
* 例如:
* <!DOCUMENT web-app PUBLIC
* "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN"
* "http://java.sun.com/dtd/web-app_2_3.dtd">
* 在xml文件內部定義:
* 在xml文檔聲明後通過語法直接將DTD寫在xml中,
* <!DOCTYPE 根元素名稱 [
* dtd內容
* ]>
*
* dtd語法:
* 元素聲明
* <!ELEMENT 元素名稱 元素的約束>
* 元素的約束:
* 存放類型、子元素的列表
* 存放類型:
* EMPTY:表示該元素的內部不能有任何其他內容
* ANY:表示該元素內部可以是任意內容
* 子元素的列表:表示該元素的內部按要求出現子元素。
* 子元素需要用小括號引起來,對於標籤體有#PCDATA表示
* (#PCDATA):表示該元素中一般包含標籤體。
* 如果子元素之間可以使用逗號","進行分割,表示子元素必須按順序出現
* 如果子元素之間用豎線"|"進行分割,表示子元素只能出現其中之一。
* 另外可以使用數量詞描述子元素出現的次數。
* +:表示1次到多次;
* *:表示0次到多次;
* ?:表示0次或1次;
* 還可以使用小括號進行組的操作
* 例如:
* <!ELEMENT MYFILE ((TITLE*,AUTHOR?,EMAIL)* | COMMENT) >
*
*
*
* 案例1:
* book.dtd:
* <!ELEMENT 書架 (書+)> 可以出現一次到多次 <!ELEMENT 書架 ANY>
* <!ELEMENT 書 (書名,作者,售價)> 注意標點符號爲英文,注意空格一定要留,不能寫在一起
* <!ELEMETT 書名 (#PCDATA)>
* <!ELEMENT 作者 (#PCDATA)>
* <!ELEMENT 售價 (#PCDATA)> 可以有標籤體
*
* book.xml:
* xml文件:
* <?xml version="1.0" encoding="utf-8" standalone="no" ?>
* <!DOCTYPE 書架 SYSTEM "book.dtd" >
* <書架>
* <書>
* <書名>mysql編程指南</書名>
* <作者>郭德綱</作者>
* <售價>9.0元</售價>
* </書>
* <書>
* <書名>JavaScript入門案例</書名>
* <作者>本拉登</作者>
* <售價>8.0元</售價>
* </書>
* </書架>
*
* 案例2:
* <?xml version="1.0" encoding="utf-8" standalone="no" ?>
* <!DOCTYPE 書架 [
* <!ELEMENT 書架 (書+)> 可以出現一次到多次 <!ELEMENT 書架 ANY>
* <!ELEMENT 書 (書,作者,售價)>
* <!ELEMETT 書名(#PCDATA)>
* <!ELEMENT 作者(#PCDATA)>
* <!ELEMETN 售價(#PCDATA)> 可以有標籤體
* <!ATTLIST 書
* 出版社 CDATA #REQUIRED
* 網址 CDATA #IMPLIED
* 出版範圍 CDATA #FIXED "中國"
* 出版次數 CDATA "1"
* 種類(工具類|科技類|文學類|藝術|雜七雜八) #REQUIRED
* 書號 ID #REQUIRED
* >
* <!ENTUTY net "www.renmin.cn">
* ] >
* <書架>
* <書 出版社="人民出版社" 網址="&net;" 出版次數="2" 種類="工具類">
* <書名>mysql編程指南</書名>
* <作者>郭德綱</作者>
* <售價>9.0元</售價>
* </書>
* <書 出版社="北京郵電出版社"出版範圍="">
* <書名>JavaScript入門案例</書名>
* <作者>本拉登</作者>
* <售價>8.0元</售價>
* </書>
* </書架>
*
*
*
* 屬性聲明
* <!ATTLIST 元素名
* 屬性名1 屬性類型 屬性約束
* 屬性名2 屬性類型 屬性約束
* ......
* >
* 屬性類型:
* CDATA 表示爲普通字符串類型,是一個普通的值
* ENUMERATED 表示屬性是一個給定的枚舉範圍內
* ID 表示該屬性作爲ID來使用,ID的特點是:在整個文檔範圍內唯一。ID的值不能用數字開頭。
* ENTITY(實體)
* 屬性約束:
* #REQUIRED 必須存在的屬性
* #IMPLIED 可選屬性
* #FIXED 固定值,表示一個固定值的屬性,可以不設定,
* 該屬性默認就有且取值爲給定的固定值,如果設定了,且
* 設定的值和給定的值不同,則報錯。
* 默認值 表示該屬性具有一個默認值,如果沒有設置該屬性,
* 該屬性也有取值爲這個默認值,如果設置了該屬性,
* 該屬性取值爲設定的值。
*
* 實體的聲明
* 所謂的實體就是將一大段的文字設定爲實體,讓其具有一個引用,在需要的地方可以通過引用
* 來使用這個實體定義的大段文本。
*
* 引用實體:在dtd中定義,在xml中使用的實體
* <!ENTITY 實體的名稱 "I am a student" >
* <!ENTITY 實體的名稱 實體的內容>
* 在xml中通過&實體名稱; 使用實體
* 實體參數:在dtd中定義在dtd中使用的實體
* <!ENTITY % 實體名稱 實體內容>
* 在dtd中通過 %實體名稱; 使用實體
*
* 舉例1:
* <!ENTITY % TAG_NAMES "姓名 | EMAIL | 電話 | 地址"> -->定義
*
* <!ELEMENT 個人信息 (%TAG_NAME; | 生日)> -->使用
* <!ELEMENT 客戶信息 (%TAG_NAME; | 公司名)>
* 2.schema
*
* 四.xml解析
* 利用java程序操作xml中的數據
* 1.兩種解析思想:
* dom方式解析:
*
* <? xml version="1.0" ?>
* <persons>
* <person id="110" gender="female">
* <name>marry</name>
* <age>18</age>
* </person>
* <person id="119" gender="male">
* <name>tom</name>
* <age>20</age>
* </person>
* </persons>
* 文檔結構樹,實現Node接口
* Document:dom:
* |_____Element:persons
* |______Element:person
* | |_________Arr:id=110
* | |_________Arr:gender=female
* | |_________Element:name
* | | |______Character:marry
* | |_________Element:age
* | |______Character:18
* |______Element:person
* |_________Arr:id=119
* |_________Arr:gender=male
* |_________Element:name
* | |______Character:tom
* |_________Element:age
* |______Character:20
* Dom:在解析時將讀取整個文檔,將文檔中的每一個內容都用對象來表示,再利用對象之間的引用關係保存數據間的層級關係,
* 組成一棵文檔結構樹,利用操作這個樹,就可以對整個文檔進行增刪改查的操作了。
*
* 缺點:
* 需要在解析時,將這個文檔加載到內存中,耗費內存,如果xml格式的數據比較大,內存不足可能無法處理。
* 需要在解析時,一次性讀取整個文檔,會比較慢。
* 優點:
* 可以非常方便的對xml文檔進行增刪改查。
* 一次解析後,內存中就具有了文檔樹,以後不需要再重複解析。
sax方式解析: (工作時:用的更多,用於查詢操作)
<? xml version="1.0" ?>__________ ______ ____________
<persons> | |解析器 |__|事件處理器 |
<person id="110"gender="female">| | | |文檔解析開始()|
<name>marry</name> | | | |{....} |
<age>18</age> | | | |文檔開始標籤()|
</person> |__| | |{....} |
<person id="119" gender="male">| | | |發現標籤體 () |
<name>tom</name> | | | |{.....} |
<age>20</age> | | | |發現結束標籤()|
</person> | | | |{....} |
</persons>_______________________| |______| |文檔解析結束()|
|{....} |
|____________|
*
* sax解析:
*通過掃描器掃描xml文檔,在掃描過程中遇到內容出發事件處理器中對應的處理方法,
* 通過巧妙的設計事件處理其中的方法,可以和獲取出需要處理的內容。
* 優點:
* 掃描方式不需要就愛那個這個文檔加載到內存,佔用內存較少。
* 不需要將整個文檔都加載到整個內存,掃到哪裏就有哪裏的數據,速度比較快,
* 另外,一旦找到了需要的數據,解析就可以立即停止,後續的內容可以不用再掃描,非常靈活。
* 缺點:
* 每次需要數據就得重新掃描。
* 只能進行查詢,不能對數據進行增,刪,改的操作。
*
* 2.解析api
* sun--->jaxp原生的加入了j2se技術中。既有dom方式,也有sax方式,
* 不需要導入其他開發包直接就可以使用。但性能非常低,不好用。
* 開源組織提供:
* jdomo
* dom4 --->市面上最多,開源組織提供的解析api,api簡單,性能高效,在很多地方都有所應用,內部集成了sax和dom
* pull --->sax解析方式的api,android原生解析方式,效率高,api簡單
* ...
* xstream
* 3.dom4j(dom for java)
* 下載並導入開發包。官網下載。jar包,裏面有很多包, 但主要用dom4j.jar包。看文檔。dom4j默認dom方式
* 查詢dom4j
* 解析book.xml:
*
* public class Dom4jDemo1{
* public static void main(String[] args){
* //1.導包,獲取解析器
* //右鍵:new -->folder-->lib-->導包進來 -->右鍵:build path
* SAXReader reader = new SAXReader();
* //2.解析xml獲取dom
* Document dom = reader.read("book.xml");
* //3.獲取根結點
* Element root = dom.getRootElement();
* //4.獲取第一本書:想要什麼就點什麼
* Element bookEle = root.element("書");
* //5.獲取<書>中的<書名>
* Element bookNameEle = bookEle.element("書名");
* //6.獲取<書名>標籤體
* String text = bookNameEle.getText();
* System.out.println(text);
*
* }
* }
*
* 利用dom4j實現對xml的增刪改查 (Creat Read Update Delete)
* public class Dom4jCRUD{
* @Test
* public void add(){
* //1.解析xml獲取dom
* SAXReader reader = new SAXReader();
* Document dom = reader.read("book.xml");
* Element root = dom.getRootElement();
* //2.憑空創建<特價>結點
* Element price2Ele = DocumentHelper.createElement("特價");
* price2Ele.setText("0.9元");
* //3.找到父結點
* Element bookEle = root.element("書");
* //4.掛載上去
* bookEle.add(price2Ele);//目前只是在內存中操作dom樹
* //5.將dom樹寫回到文件中
*
* //FileWriter writer =
* // new OutputStreamWriter(new FileOutputStream("book.xml"),"utf-8");
* //dom.write(writer);
* //writer.close();//不flush或close,文件會死在緩衝區
*
* XMLWriter writer =new
* WMLWriter(new FileOutputStream("book.xml"),
* OutputFormat.createPrettyPrint());
* writer.write(dom);
* writer.close();
*
* }
*
* @Test
* public void update() throw Exception{
* //1.解析xml獲取dom
* SAXReader reader = new SAXReader();
* Document dom = reader.read("book.xml");
* Element root = dom.getRootElement();
* //2.獲取需要修改結點
* Element price2Ele = root.element("書").element("特價");
* //3.修改內容
* pricesEle.setText("1.0元");
* //4.寫回文件中
* XMLWriter writer = new
* XMLWriter(new FileOutputStream("book.xml"),
* OutputFormat.creatCompactFormat().createPrettyPrint());
*
* Writer.write(dom);
* writer.close();
* }
*
* @Test
* public void find()throw Exception{
* //1.解析xml獲取dom
* SAXReader reader = new SAXReader();
* Document dom = reader.read("book.xml");
* Element root = dom.getRootElement();
* //2.獲取第二本書的名字
* List<Element> list = root.elements("書");
* Element bookEle = list.get(1);
* Strings bookName = bookEle.element("書名");
* System.out.println(bookName);
* }
*
* @Test
* public void del(){
* //1.解析xml獲取dom
* SAXReader reader = new SAXReader();
* Document dom = reader.read("book.xml");
* Element root = dom.getRootElement();
* //2.獲取要刪除的結點
* Element price2Ele = root.element("書").element("特價");
* //3.獲取要刪除結點的父結點,刪除結點
* price2Ele.getParent().remove(price2Ele);
* //4.寫出到文件中
* XMLReader writer = new XMLReader(new FileOutputStream("book.xml"),
* OutputFormat.createCompactFormat().createPrettyPrint());
*
* Writer.write(dom);
* writer.close();
* }
* @Test
* public void add2() throws Exception{
* //1.解析xml獲取dom
* SAXReader reader = new SAXReader();
* Document dom = reader.read("book.xml");
* Element root = dom.getRootElement();
* //2.獲取父結點
* Element bookEle = root.element("書");
* //3.憑空創建出結點
* Element price2Ele = DocumentHelper.createElement("特價");
* price2.Ele.setText("0.5元");
* //4.掛載
* List<Element> list = bookEle.elements();
* list.add(1,price2Ele);
* 5.寫回
* XMLReader writer = new XMLReader(new FileOutputStream("book.xml"),
* OutputFormat.createCompactFormat().createPreetyPrint());
* Writer.write(dom);
* Wrirer.close();
*
* }
*
* @Test
* public void attr() throws Exception{
* ` //屬性設置
* //1.解析xml獲取dom
* SAXReader reader = new SAXReader();
* Document dom = reader.read("book.xml");
* Element root = dom.getRootElement();
*
* //2.獲取父結點
* Element bookEle = root.element("書");
*
* //新增屬性方法一:
* //3.憑空創建屬性對象
* Attribute attr = DocumentHelper.creatAttribute(bookEle,"出版社","人民出版社");
* //4.掛載上去
* bookEle.add(attr);
*
*
* //---新增屬性方法二:
* //bookEle.addAttribute("種類","工具書");//便捷方法,不是dom樹的方法
* bookEle.setAttribute("種類","工具書");
*
* //---修改屬性
* bookEle.setAttributeValue("種類","文學書");//方法過時,不推薦使用了
*
* //---查找屬性值方式一:
* Attribute attr = bookEle.arrribute("出版社");
* System.out.println(attr.getName());
* System.out.println(attr.getValue());
*
* //---查找屬性方式二:
* String v = bookEle.attributeValue("出版社");
* System.out.println(v);
*
* //---刪除屬性
* Attribute attr = bookEle.attribute("出版社");
* bookEle.remove(attr);
*
* //5.更新xml
XMLReader writer = new XMLReader(new FileOutputStream("book.xml"),
* OutputFormat.createCompactFormat().createPreetyPrint());
* Writer.write(dom);
* Wrirer.close();
* }
*
* }
*
*/
XML學習教程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.