15.javaweb XML詳解教程
一、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詳解教程