Java WEB —— XML

來源:互聯網
上載者:User

標籤:

XML語言(可延伸標記語言 (XML)W3C):描述一系列有關係的資料,允許自訂標籤,它常用作軟體設定檔,以描述程式模組之間的關係。

  • XML文法:文檔聲明,元素,注釋(DATA區,特殊字元,處理指示(processing instruction))
    • 文檔聲明:聲明文檔的類型
      • 例如:<?xml version="1.0"?> <?xml version = "1.0" encoding = "gb2312" ?>
      • 亂碼問題:瀏覽器預設為GB2312格式來解析,而文字文件儲存成了UTF-8格式,則會出現亂碼。
    • 元素:XML檔案中出現的標籤
      • 可以嵌套,但是不能交叉嵌套
      • 可以帶主體的標籤<a>...</a>,也可以不帶主體的<a />
      • 必有且僅有一個根標籤
      • 標籤中的換行和空格都是原始檔案,不能格式混亂
      • 標籤規範:不能以數字和"_"開頭,不能以xml(Xml或XML)開頭,不能有空格,中間不含":"
    • 屬性:
      • 屬性值一定用"雙引"或"單引"引起來
      • 可以使用子標籤,例如<input><name>...</name>
    • 注釋:<!-- -->聲明之前不能有注釋,不能有嵌套注釋。
    • CDATA區:內容解析引擎不會解析內容,原封不動輸出。<用於程式>

      <![CDATA[內容]]>  例:<![CDATA[...<><>...]]>

    • 逸出字元:不要漏分號

      & --> &amp;  < --> &lt;  > --> &gt;  " --> &quot;  ‘ -->&apos;

    • 處理指示(PI):處理指示用來指揮解析引擎如何解析XML文檔內容。例:<?xml-stylesheet type="text/css" href="1.css" ?>聲明語句也是處理指示。
  • XML約束:架構的作者需要約束設定檔的編寫格式
    • DTD約束技術:Document Type Definition文件類型定義
<?xml version="1.0" ?>  //XML檔案<!DOCTYPE 書架 SYSTEM "book.dtd"><書架>    <書>        <書名>Java ...</書名>        <作者>張孝祥</作者>        <售價>39.00元</售價>    </書>    <書>        ...    </書></書架>

 

<!ELEMENT 書架 (書+>    //+表示一本或多本    <!ELEMENT 書 (書名,作者,售價)>        <!ELEMENT 書名 (#PCDATA)>        <!ELEMENT 作者 (#PCDATA)>        <!ELEMENT 售價 (#PCDATA)>   
      • DTD檔案應使用UTF-8或Unicode編碼,若不符合DTD規則,在瀏覽器下開啟XML也能通過,所以應該使用Eclipse來校正。
      • DTD約束有兩種形式,可以寫在xml中,也可以單獨一個檔案。
      • XML檔案使用DOCTYPE聲明語句來指明它所遵循的DTD檔案。
        • <!DOCTYPE 文檔根節點 SYSTEM "DTD檔案的URL">
        • <!DOCTYPE 文檔根節點 PUBLIC "DTD名稱" "DTD檔案的URL"> 引用的是公用檔案。例如:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems.Inc. //DTD ...." "http://java.sun.com/dtd/web_app_2_3.dtd">
    • DTD約束文法細節:(元素定義,屬性定義,實體定義)
      • 元素定義:在DTD文檔中使用ELEMENT聲明一個XML元素,文法為<!ELEMENT 元素名稱 元素類型>
        • 元素類型可以是元素內容或類型,如<!ELEMENT 書架(書名,作者,售價)> 和 <!ELEMENT 書名 (#PCDATA)> --> 元素內容需要用()括起來。EMPTY->用於定義空元素,ANY為任意類型->元素類型可以直接寫。
        • 元素內容的組成關係:用逗號分隔,表示出現順序要一致;用"|"分隔,表示任選其一,只能出現其中一個。元素內容可以出現"+",表示一次或多次,"?"表示0次或一次,"*"表示0次或多次。
      • 屬性定義:XML文檔中的標籤需要通過ATTLIST為其設定屬性。
        • 文法:
<!ATTLIST 元素名        屬性名稱1        屬性值類型        設定說明      .......  >如:<!ATTLIST 商品        類別        CDATA(相當於String)        #REQUIRED(必須設定的屬性)        顏色        CDATA(相當於String)        #IMPLIED(可選屬性)>
        • 設定說明:#REQUIRED為必須設定該屬性,#IMPLIED可以設定也可以不設定,#FIXED取值固定一個值,但是要提供這個值,並且直接使用預設值,可以預設也可以修改。例:
<!ATTLIST 頁面作者        姓名        CDATA        #IMPLIED        年齡        CDATA        #IMPLIED        聯絡資訊    CDATA        #REQUIRED        網站職務    CDATA        #FIXED        "頁面作者"  //預設值可以不寫        個人愛好    CDATA        "上網"     //預設值可以不寫>
        • 屬性值類型:CDATA --> 普通文本字串  ENUMERATED --> 枚舉(雞肉|豬肉|牛肉)  ID --> 標籤的唯一標識,只能由字母開頭,不能出現空格ENTITY(實體) --> 建立一段內容的別名
          • ENTITY定義文法:<!ENTITY 實體名稱 "實體內容">,以&實體名稱 --> 實體內容方式在XML中引用。例如
<!ENTITY copyright "I am a programmer">    //在XML中使用&copyright;來引用<!ENTITY %實體名稱 "實體內容">  //以%實體名稱; --> 實體內容方式引用<!ENTITY %TAG_NAMES "姓名|E-MAILS|電話|地址"><!ELEMENT 個人資訊 (%TAG_NAMES;|生日)><!ELEMENT 客戶資訊 (%TAG_NAMES;|公司名)>
  • XML編程(CRUD 增刪改查):
    • XML解析方式:dom和sax
      • DOM(document object model):記憶體消耗較大,但是增刪改查很容易。特點:標籤,文本,屬性皆是對象。
      • SAX(simple API for XML) :不是官方標準,但廣泛使用sax。特點:讀一行解析一行,記憶體消耗小,不適合增刪改查。
    • XML解析開發包:Jaxp(sun),Jdom,dom4j。其中,dom4j最好用。
      • Jaxp:是J2SE的一部分,由javax.xml,org.w3c.dom,org.xml.sax包及子包組成。在javax.xml.parsers包中,定義了幾個工廠類,程式員調用工廠類可以得到xml文檔的DOM解析器和SAX解析器,從而實現了XML的解析。
        • 實現:DocumentBuilderFactory抽象類別調用newInstance方法擷取工廠對象,在調用對象中的parse方法,返回一個DOM的Document對象,在用Document對象,實現XML文檔的增刪改查。
        • 代碼:
Document doc = builder.parse("src/book.xml");NodeList list = doc. getElementByTagName("書名");Node node = list.item(1);String content = node.getTextContent();

           增刪改查都可以參照API,Document,Node,Element,transform等完成。

    • Sax解析:採用事件處理的方式解析XML檔案,涉及解析器和事件處理器
      • 解析器可以使用Jaxp的API建立,建立出SAX解析器去解析某個XML文檔。
      • 解析器採用SAX方式解析某個XML文檔時,只要解析到XML文檔的組成部分,就會去調用時間處理器的方法,並把內容傳給時間處理器(參數傳遞)。
      • 通過事件處理器的參數,可以獲得解析後的資料,從而決定後續的操作。(事件處理器由程式員編寫)
      • 流程:SAXPARSERFactory --> SaxParser --> SaxReader -->Content Handle(傳入XML文檔) --> 事件處理器。事件處理器的編寫可以查看API,Content Handle可以利用DefaultHandler繼承,並覆蓋start,character,end方法即可。
      • javabean封裝xml文檔資料:
        • 先建立javabean類,再重寫DefaultHandler的start,character,end方法,以標籤為條件判斷,存入List中。注意在標籤結束時,應清空記錄的標籤,否則在標籤結束時,跳入空行中間欄位,拋出null 指標異常。
    • Dom4j解析:(Hibernate就是使用dom4j解析設定檔):
      • 首先在Jre中匯入dom4j的jar包<注意其檔案中的jar包和支援jar包都要匯入>。可以查看Dom4j的文檔,可以快速瞭解dom4j的編程。
      • 亂碼問題:儲存資料如果有亂碼問題,可以初步判斷是IO流的問題,使用OutputStream(File,charset)來選擇合適的編碼方式。而XMLWriter.write採用UTF-8的方式寫XML檔案,所以若需要寫XML檔案以GB2312方式,需要定義format輸出器。建議用位元組流,因為如果用字元流,是由字元流來查碼錶。若用位元組流,則是由XMLWriter來查碼錶。
      • 增刪改查:
        • <Create>得到Root節點,再一次往下找要增加標籤的父標籤,若要加入標籤到序列中,需要得到父標籤的子標籤集合{List=element();},再調用List的add方法插入至指定位置。
        • <Delete>從根節點向下,指到要刪除的結點,再找到父標籤,調用remove方法。
        • <Update>從根節點向下找到目的節點,調用setText()方法。
      • XPath:快速定位XML資料 <XPATH TUTORIAL>文檔
        • 文法:單斜杠:從根項目開始寫;雙斜杠:從絕對路徑開始  //*  //BBB[屬性] --> 插文檔
        • 代碼:
SAXReader reader = new SAXReader();Document doc = reader.read(new File("...."));doc.selectSingleNode("//作者");    //擷取單個結點doc.selectNodes("...");    //擷取所有結點
      • 匹配使用者名稱密碼:
Node node = document.selectSingleNode("//user[@username=‘"+password+"‘ and @password=‘"+password+"‘]");if(node == null){    system.out.println("使用者名稱密碼錯誤");}else{    ....}
    •  Schema約束:
      • 特性:
        • Schema符合XML文法結構(用XML約束XML)。
        • 可以使用Dom4j等解析Schema(因為Schema本身就是個XML)
        • Schema專屬命名空間。Schema比DTD支援更多的資料類型,約束功能更強。
        • 不能定義實體,且比DTD複雜。已成為W3C標準。
      • 尾碼名.xsd,一個Schema文檔通常稱之為模式文檔,遵循文檔的XML檔案稱為執行個體文檔。
      • XML Schema必須有根節點,並且一定是Schema名稱。
      • 在編寫Schema文檔後,需要將文檔中聲明的元素繫結到URI上,即把XML Schema文檔聲明的元素繫結到一個命名空間上,以便以後解析引擎找到解析方法。
      • 名稱空間:在Schema中,每個約束模式文檔都可以被賦予一個唯一的名稱空間,在XML書寫標籤時,可以通過名稱空間聲明(xmlns)來表明當前編寫的標籤來自哪個Schema文檔。
<itcast:書架 xmlns:itcast="http://www.itcast.cn">    <itcast:書>....</itcast></itcast:書架>
        • 為了找到具體檔案的位置,需指定SchemaLocation屬性。例:
<itcast:書架 xmlns:itcast="http://www.itcast.cn"xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instance"xsi:schemalocation="http://www.itcast.cn book.xsd">
        • 使用預設的名稱空間:xmlns="URI"。例如:
<書架 xmlns="www.itcast.cn" >    //指定了一個預設的名稱空間    ......    ......    <書>....</書></書架>
        • 使用名稱空間引入多個XML Schema文檔:多寫一行xmlns,多謝一個SchemaLocation,可以使用兩種約束文檔。
        • 不使用名稱空間:<書架 xml:xsi=.... xsi:noNameSpaceSchemaLocation="xmlBook.xsd">
    • Schema文法:查看w3c文檔

Java WEB —— XML

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.