1. 程式人生 > >15.javaweb XML詳解教程

15.javaweb XML詳解教程

概念 text jvm 轉義 package fig 練習 編程 麗江

一、XML語言簡介

1, 作用:用於描述和保存現實中具有某種關系的數據,還可以作為軟件配置文件,和描述程序模塊之間的關系

技術分享

2, 語法:

首先 先看一個XML文件的組成部分

技術分享

關於文檔聲明

技術分享

Version同時使用為w3c在2000年頒布的1.0版本,encoding指明瀏覽器在解析xml文件是編碼,必須與xml文件保存的是編碼一致,否則會出現亂碼文件,因為xml文件在保存時是按照某編碼規則將中文編碼成二進制數,瀏覽器再解析的時候按照此編碼可將二進制數解析成正確中文,否則將報錯。

關於元素,即標簽,一個xml文檔中有且只有一個根標簽,標簽分含標簽體<a>***</a>和不含標簽體<a/>,標簽體中的空格和換行都會被當作標簽內容處理。對於標簽的命名規範如下

技術分享

關於屬性,一個標簽中可以有多個屬性,屬性由屬性名和值組成,屬性名命名規範與元素一樣,小技巧”可以將一個屬性改寫成標簽的一個子標簽

關於註釋:<!--註釋-->,註釋不能在文檔聲明之前,也不能嵌套

關於CDATA區

技術分享

關於轉義字符

技術分享

關於轉義與CDATA區別,轉義是把XML中特殊字符顯示出來給人看,CDATA是把XML中內容讀給程序看

關於處理指令

技術分享

應用

XML文件

技術分享

結果

技術分享

3, DTD約束和DTD校驗

概述:在XML技術裏可以編寫一個文檔來約束一個XML文檔的書寫規範,這稱之為XML約束

約束分類:XML DTD,XML Schema

XML DTD

技術分享

<! DOCTYPE 暑假 SYSTEM “book.dtd”> 表示引用book.tdt約束來約束XML文檔的書寫規範

<! ELEMENT 書架 (書+)>表示在”書架”這個標簽中,可以有多個“書”子標簽

<! ELEMENT 書(書名,作者,售價)>表示”書”這個標簽中,應該有“書名”,“作者”,“售價”這個三個子標簽

<! ELEMENT 書名 (#PCDATA)>表示”書名”這個標簽中的內容應該是字符串

XML DTD文檔的編寫:DTD約束既可作為一個單獨的文件編寫,也可以XML文件內編寫

上述例子即為單獨文件編寫,下面是在一個XML文件內編寫

技術分享

DTD文檔的引用

技術分享

DTD約束語法:元素定義,屬性定義,實體定義

元素定義

技術分享

技術分享

屬性定義

技術分享

設置說明

技術分享

屬性值類型:枚舉

技術分享

屬性值類型:ID

技術分享

常用屬性值類型

技術分享

實體定義:概念

技術分享

實體定義:引用實體

技術分享

實體定義:參數實體

技術分享

4, xml編程(CRUD)

XML解析技術

技術分享

關於dom和sax的區別

dom解析是把XML的節點以文檔對象的形式保存的內存中,對象之間以樹的形式組織,所以dom解析適合對XML文件增刪改查,但對內存消耗較大

sax解析是一行一行的讀取XML文件並解析,所以sax解析對內存消耗較小,解析速度快,但不適合增刪改查

技術分享

調整jvm最大占用內存大小:JVM默認程序的最大可占用內存是64M,當程序運行所需內存超過了這個值就會報錯

可通過如下方式設置程序運行時最大可占用內存,設置值為80M

技術分享

5, JAXP解析包對XML文檔進行dom解析

技術分享

註意導入javax.xml.parsers包

dom解析下,xml文檔的每一個組成部分都會用一個對象表示,例如標簽用Element,屬性用Attr,但不管什麽對象都是Node的子類,所以在開發中可以獲取到的任何結點都當作Node對待。

package com.chen.ying;

import java.io.FileOutputStream;

 

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

import javax.xml.transform.stream.StreamSource;

 

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

public class paraseDemo01 {

    public static void main(String[] args) throws Exception {

        //1,創建工廠,得到工廠實例

        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

        //2,通過工廠得到dom解析器

        DocumentBuilder builder=factory.newDocumentBuilder();

        //3,解析XML文檔,得到代表文檔的document對象

        Document document=builder.parse("src/com/chen/ying/country.xml");//最好填寫絕對路徑

        //4,對XML文檔進行增刪改查

       

        //查詢結點

        NodeList list01=document.getElementsByTagName("province");//將查詢結果放在Node鏈表中

        Node node01=list01.item(1);//取得鏈表的第二個元素;

        String content01=node01.getTextContent();//得到結點內容

        System.out.println("查詢到的省份信息:"+content01);

       

        //遍歷所有結點

        Node node02=document.getElementsByTagName("country").item(0);//得到根結點

        listAll(node02);//遞歸遍歷

       

        //查詢指定結點的指定屬性,如果已知查詢結果是元素,則可以直接用Element接收,這樣操作更豐富準確

        Element element01=(Element)document.getElementsByTagName("province").item(0);//取得“四川”結點

        String value=element01.getAttribute("id");//由屬性名得到屬性值

        System.out.println(value);

       

        //向XML"四川"結點中添加結點:<city>遂寧</city>

        Element city=document.createElement("city");

        city.setTextContent("遂寧");//創建結點並向結點添加內容

        Element province01=(Element)document.getElementsByTagName("province").item(0);

        province01.appendChild(city);//將創建的結點掛到指定的節點下

       

        //向指定位置處添加節點:<city>麗江</city>

        Element insertCity=document.createElement("city");

        insertCity.setTextContent("麗江");//創建結點並向結點添加內容

        //得到掛子節點

        Element province02=(Element)document.getElementsByTagName("province").item(1);

        //得到位置參考節點

        Element localCity=(Element)province02.getElementsByTagName("city").item(1);

        //向掛子節點的指定位置插入節點

        province02.insertBefore(insertCity, localCity);

       

        //為指定節點添加屬性

        element01.setAttribute("mainCity", "成都");//為“四川”節點添加屬性

       

        //刪除指定節點和屬性:刪除指定節點需要找到這個節點和這個節點的·父節點

        Element province03=(Element)document.getElementsByTagName("province").item(2);

        province03.getParentNode().removeChild(province03);

       

        //更新結點內容:找到需要更新的節點然後重新設置內容

        Element city01=(Element)document.getElementsByTagName("city").item(0);

        city01.setTextContent("綿陽");

       

        //將更新後的內存寫回XML文檔所在硬盤區

        TransformerFactory tfactory=TransformerFactory.newInstance();

        Transformer tf=tfactory.newTransformer();

        tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/com/chen/ying/country.xml")));

 

    }

    public static void listAll(Node node) {

        if(node instanceof Element){//如果結點是元素則打印(解析時會將一個結點內所有內容解析成對象)

            System.out.println(node);

        }

        NodeList list=node.getChildNodes();//得到一個結點下的所有子結點,包括空格

        for(int i=0;i<list.getLength();i++){

            listAll(list.item(i));//遞歸遍歷

        }

    }

}

XML文檔

  <?xml version="1.0" encoding="UTF-8"?>

<country>

    <province id="四川">  <!--省份-->

         <city>成都</city>

         <city>廣安</city>

         <city>南充</city>

    </province>

    <province id="雲南">

         <city>楚雄</city>

         <city>昆明</city>

         <city>大理</city>

    </province>

    <province id="浙江">

         <city>杭州</city>

         <city>寧波</city>

    </province>

</country>

案例練習,用xml文件作為數據庫保存學生成績等信息,然後用DAO的方式進行增刪改查

6, sax解析

技術分享

15.javaweb XML詳解教程