XML學習教程

/*
 * 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區,轉義字符
 *      轉義字符:
 *      如果文檔中普通字符中包含了一些特殊字符,導致解析引擎解析出現問題,可以通過轉義字符進行轉義
 *      <   -->     &lt;
 *      >   -->     &gt;
 *      &   -->     &amp;
 *      "   -->     &quot;
 *      '   -->     &apos;
 *      轉義字符適用於需要轉義內容比較少的情況,如果需要將一大段內容進行轉義可以使用CDATA區進行。
 *      CDATA區:
 *      <![CDATA[
 *          需要轉義內容
 *      ]]>
 *      CDATA區適用於將一大段內容進行轉義,好處可以處理一大段內容,不需要將內容中每一個內容進行
 *      單一處理;
 *      例如:
 *      <? xml version="1.0" encoding="gbk" standalone="yes" ?>
 *      <person>
 *          <name>張&lt;name&gt;</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();         
 *      }
 * 
 * }
 * 
 */

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章