




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第14章 Java讀寫XML技術 14.1 XML簡介簡介 14.2 SAX接口解析接口解析XML 14.3 DOM接口解析接口解析XML 習習 題題 14.1 XML 簡簡 介介14.1.1 XML定義定義 XML是SGML一個簡化而嚴格的子集,特別是為Web應用設計的,具有可擴展性、結構性和可檢驗性。 可擴展性指用戶可以根據需要自定義新的標識以及屬性名,更好地從語義上修飾數據。 結構性指XML文件結構可以嵌套,也可以復雜到任意程度。 可校驗性指XML文件文件可以包括一個語法描述,應用程序可以通過語法描述對此文件進行結構檢驗。14.1.2 XML分類分類圖14.1 XML相關標準的體系結構(
2、基礎標準)XML(元語言標準)HTTPURI/URLUnicode(外圍標準)xInclude(核心標準)RDF(內容描述標準)cXML(應用標準)SchemaDOM(操作標準)CSSXSLXSLT(樣式與鏈接標準)1. 元語言標準元語言標準用來描述標準的元語言,即XML標準。 XML相關標準主要分為三類,分別是元語言標準、基礎標準和應用標準。 2. 基礎標準基礎標準 為XML進一步實用化制定的標準,共分為五類:外圍標準、核心標準、操作標準、樣式與鏈接標準、內容描述標準。 (1) 外圍標準指Internet網絡上統一應用的標準: HTTP協議采用請求/應答方式,客戶端向服務器提交請求方式、UR
3、I、協議版本、客戶端信息等,服務器向客戶端返回狀態信息、實體信息以及實體內容等。 URI/URL指資源定位符,用來在網絡上實現快速資源定位。 Unicode指Internet網上統一傳輸數據的標準編碼。 (2) 核心標準是XML核心的標準。 (3) 操作標準為XML文檔的處理提供有效的方法與規則,DOM是與平臺無關的,提供一個編程接口。Schema是對DOM的補充,提供一種更為嚴格的描述XML文檔的結構、屬性、數據類型等的方法。 (4) 樣式與鏈接標準。 CSS是XML文檔顯示的樣式標準。 XSL標準可將XML文檔形成樹狀結構,采用元素節點匹配的方式進行轉換,因而該標準提供轉換和顯示的標準。
4、XSLT標準是從XSL中分離出來的,是XML文檔的轉換標準,可以將XML文檔轉換為HTML文檔并進行顯示處理。 (5) 內容描述標準。 RDF(Resourse Description Format)采用XML語法格式處理元數據的應用,是為描述圖像文檔和它們之間的相互關系定義的一個簡單數據模型,為進行資源描述定義了資源描述的規則。 3. 應用標準應用標準 XML標準是Internet時代的ASCII標準,主要針對具體的領域進行應用,如cXML是指電子商務XML應用標準、voiceXML指語音XML等。14.1.3 XML文檔的書寫文檔的書寫圖14.2 XML文檔舉例 王飛 理工大學 26634
5、57 教授 14.1.4 XML文檔的解析文檔的解析圖14.3 XML文檔的處理過程XML應用程序SAX接口DOM接口XML分析器XML文檔14.2 SAX接口解析接口解析XML14.2.1 解析的步驟解析的步驟(1) 創建SAX解析工廠的實例。SAXParserFactory spf = SAXParserFactory.newInstance();(2) 創建一個SAX解析器。SAXParser sp = spf.newSAXParser();(3) 得到SAX的處理器(處理器由用戶自己編寫實現)。SAXHandler handler = new SAXHandler(); (4) 使用用
6、戶創建的處理器,解析器解析文件。sp.parse(new InputSource(reader), handler);14.2.2 相關類相關類 在J2sdk1.4中的SAX版本為2.0,它提供DefaultHandler(org.xml.sax.helpers.DefaultHandler)接口,通過這個接口實現自己的解析器。接口中需要實現的解析函數為: public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException 讀取XML數據的
7、節點元素開始時觸發,需要實現這個方法進行標記元素的名字的操作。 public void endElement(String uri, String localName, String qName) throws SAXException 處理節點元素終止時觸發,可以添加代碼來將節點數據進行存儲。 public void characters(char ch, int start, intlength) throws SAXException 處理節點之間的數據,可以添加代碼來讀取節點間的數據值。 【例14.1】編寫一個SAX處理器,對14.1節中的person.xml進行解析,輸出XML文件節
8、點的標簽和節點的值。 分析:類SAXHandler是一個處理類,實現這個DefaultHandler接口時覆蓋了上述三個方法,將讀取的節點標簽和節點的值存入到Hashtable對象中。類中提供了一個方法,返回讀取的名-值對的Hashtable對象。輸出結果如圖14.4所示。源程序代碼如下:/程序文件名為Parse.javaimport java.io.*; import java.util.Hashtable;import org.w3c.dom.*; import org.xml.sax.*;import javax.xml.parsers.SAXParser; import javax.x
9、ml.parsers.SAXParserFactory;import org.xml.sax.helpers.*;public class Parsepublic static void main(String args)tryFile file = new File(person.xml);FileReader reader = new FileReader(file);/創建解析工廠實例 SAXParserFactory spf = SAXParserFactory.newInstance(); /創建解析器 SAXParser sp = spf.newSAXParser(); /創建處理
10、類實例 SAXHandler handler = new SAXHandler(); /解析 sp.parse(new InputSource(reader), handler); Hashtable hashTable = handler.getTable(); /輸出數據System.out.println(教師信息表); System.out.println(姓名:+ (String)hashTable.get(new String(name); System.out.println(學院: + (String)hashTable.get(new String(college); Sys
11、tem.out.println(電話: + (String)hashTable.get(new String(telephone); System.out.println(職稱: + (String)hashTable.get(new String(title); catch(Exception e) System.out.println(e.getMessage(); ;/自定義處理類class SAXHandler extends DefaultHandler private Hashtable table = new Hashtable(); private String current
12、Element = null; private String currentValue = null; public Hashtable getTable() return table; /覆蓋startElement方法,取出節點標簽 public void startElement(String uri,String localName,String qName,Attributes attributes) currentElement = qName; /覆蓋characters方法,取出節點值 public void characters(char ch, int start, int
13、 length) throws SAXException currentValue = new String(ch, start, length); /覆蓋endElement方法,放入Hashtable public void endElement(String uri,String localName,String qName) throws SAXException if (currentElement.equals(qName) table.put(currentElement, currentValue); ;圖14.4 解析person.xml文件后輸出結果14.3 DOM接口解析
14、接口解析XML14.3.1 解析的步驟解析的步驟1. 從從DOM接口寫接口寫XML的步驟的步驟(1) 創建DocumentBuilderFactory的一個實例;(2) 創建DocumentBuilder的一個新實例;(3) 構建一個DOM對象;(4) 創建ROOTELEMENT對象;(5) 創建單個ELEMENT節點;(6) ELEMENT創建節點的值;(7) 將ELEMENT掛接到ROOT上;(8) 寫入XML文件。2. 從從DOM接口讀接口讀XML的文件步驟的文件步驟(1) 創建DocumentBuilderFactory的一個實例;(2) 創建DocumentBuilder的一個新實例
15、;(3) 根據已有的XML文件構建一個DOM對象;(4) 得到ROOTELEMENT對象;(5) 得到單個ELEMENT節點;(6) 得到ELEMENT創建節點的值。14.3.2 相關類相關類1. DocumentBuilderFactory類類public abstract class DocumentBuilderFactory extends Object定義工廠API,使得應用程序得到解析器從XML文檔中產生的DOM對象樹。public static DocumentBuilderFactory newInstance() throws FactoryConfigurationErro
16、r得到DocumentBuilderFactory的一個實例,這個實例某個時刻只能用于一個線程。public abstract DocumentBuilder newDocumentBuilder() throws ParserConfigurationException使用當前配置的方法創建一個新的DocumentBuilder的實例。2. DocumentBuilder類類public abstract class DocumentBuilder extends Object定義從XML文檔得到DOM文檔的API。public abstract Document newDocument()
17、得到DOM文檔對象的一個新實例,用來構建DOM樹。public Document parse(File f) throws SAXException, IOException解析給定的XML文檔f,返回DOM文檔對象。3. Document類類public interface Document extends NodeDocument接口代表整個XML文檔。public Element createElement(String tagName) throws DOMException創建指定的類型的元素tagName。public Text createTextNode(String data
18、)使用給定的data字符串創建節點元素的值。 4. Element類類 public interface Element extends Node Element接口代表XML文檔中的一個元素。 public NodeList getElementsByTagName(String name) 返回給定的name元素下面的所有節點列表,以前向遍歷的方式給出。5. NodeList類類NodeList接口給出一個節點集合,有以下兩個方法:public int getLength()返回節點的個數。public Node item(int index)返回第index個節點。 6. Node類類
19、Node接口是整個文檔對象模型中最主要的數據類型,它表示文檔樹中單一的節點。 Node getFirstChild() 返回節點的第一個孩子節點。 String getNodeValue() 返回葉子節點的值。14.3.3 實例實例 【例14.2】在用戶界面(見圖14.5)上輸入個人信息后,單擊“確定”按鈕,程序收集用戶信息,存成文檔user.xml并顯示如下。單擊“顯示”按鈕,讀取user.xml文件,將節點標簽和對應的節點值顯示在文本區域內。王軍隊海納百川,有容乃大;壁立千仞,無欲則剛1. 程序源文件程序源文件/程序文件名UsePanel.javai
20、mport java.awt.*;import java.awt.event.*;import java.applet.*;import java.applet.Applet;import java.io.*;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.*;public class UsePanel extends Applet implements ActionListenerLabel lblName,lblNumber
21、,lblSex,lblJob,lblText;TextField tfName,tfNumber;Checkbox chMale, chFemale;CheckboxGroup c;TextArea taText;Choice chJob;Button btnOk,btnDisplay;Panel p1,p2,p3,p4,p5,p6,p7,p8,p9;String strName,strNumber,strSex,strJob,strText;public void init()/初始化界面對象lblName = new Label(姓名:);lblNumber = new Label(身份證
22、號:);lblSex = new Label(性別);lblJob = new Label(職業);lblText = new Label(個性化宣言:);tfName = new TextField(23);tfNumber = new TextField(20);taText = new TextArea(10,20);c = new CheckboxGroup();chMale = new Checkbox(男,c,true);chFemale = new Checkbox(女,c,false);chJob = new Choice();chJob.add(計算機業);chJob.add
23、(醫生);chJob.add(教師);chJob.add(軍隊);btnOk = new Button(確定);btnDisplay = new Button(顯示);p1 = new Panel();p2 = new Panel();p3 = new Panel();p4 = new Panel();p5 = new Panel();p6 = new Panel();p7 = new Panel(new BorderLayout();p8 = new Panel();p9 = new Panel(new BorderLayout(); /設置界面 p1.add(lblName);p1.add
24、(tfName);p2.add(lblNumber);p2.add(tfNumber);p3.add(lblSex);p3.add(chMale);p3.add(chFemale);p4.add(lblJob);p4.add(chJob);p5.add(p3);p5.add(p4);p6.setLayout(new BorderLayout();p6.add(p1,BorderLayout.NORTH);p6.add(p2,BorderLayout.CENTER);p6.add(p5,BorderLayout.SOUTH);p7.add(lblText,BorderLayout.NORTH);
25、p7.add(taText,BorderLayout.CENTER);p8.setLayout(new FlowLayout(FlowLayout.CENTER,30,10);p8.add(btnOk);p8.add(btnDisplay);p9.add(p6,BorderLayout.NORTH);p9.add(p7,BorderLayout.CENTER);p9.add(p8,BorderLayout.SOUTH);add(p9);/添加監聽事件btnOk.addActionListener(this);btnDisplay.addActionListener(this);btnDispl
26、ay.setEnabled(false);strName = new String();strNumber = new String();strSex = new String();strJob = new String();strText = new String();public void actionPerformed(ActionEvent evt)String arg = evt.getActionCommand(); /收集用戶信息并寫入XML文件if(arg.equals(確定)strName = tfName.getText().trim();strNumber = tfNum
27、ber.getText().trim();if(chMale.getState()strSex = 男;elsestrSex = 女;strJob = chJob.getSelectedItem();strText = taText.getText().trim();try /創建新的文檔對象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document doc = db.newDocument();/創建元素Ele
28、ment root = doc.createElement(UserData);Element eName = doc.createElement(Name);Element eNumber = doc.createElement(Number);Element eSex = doc.createElement(Sex);Element eJob = doc.createElement(Job);Element eText = doc.createElement(Text);/添加節點root.appendChild(eName);root.appendChild(eNumber);root.
29、appendChild(eSex);root.appendChild(eJob);root.appendChild(eText);/添加值eName.appendChild(doc.createTextNode(n + strName + n);eNumber.appendChild(doc.createTextNode(n + strNumber + n);eSex.appendChild(doc.createTextNode(n + strSex + n);eJob.appendChild(doc.createTextNode(n + strJob + n);eText.appendChi
30、ld(doc.createTextNode(n + strText + n);/創建文件對象File f = new File(user.xml);FileOutputStream fOut = new FileOutputStream(f);/初始化xml文件fOut.write(n.getBytes();/寫入文件fOut.write(root.toString().getBytes();fOut.flush();fOut.close();btnDisplay.setEnabled(true);catch(Exception e)System.out.println(e.getMessag
31、e(); /讀取XML文件并輸出到文本區域else if(arg.equals(顯示) try /得到XML文檔對象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(user.xml); Element root = doc.getDocumentElement(); /獲取葉子節點值strName = root.getElementsByTagName(Name).item(0).getFirstChild().getNodeValue().trim();strNumber =root.getElementsByTagName(Number).item(0).getFirstChild(). getNodeValue().trim();strSex = root.getElementsByTagName(Sex).item(0).getFirstChild(). getNodeValue().trim();strJob = root.getElementsByTagName(Job).item(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 足療店技術入股協議合同
- 2025民宿客棧裝修合同模板
- 日照合作協議書
- 2025年農業用地流轉合同書模板
- 道閘工程供貨合同協議
- 連鎖酒店協議單位合同
- 智障監護協議書
- 炸雞員工協議書
- 貸款合同延續協議書模板
- 轉讓洗車服務合同協議
- 2025-2030中國數據中心(IDC)行業市場發展分析及發展趨勢與投資前景研究報告
- 海鮮餐飲加盟合同協議
- 《如何打造高效微博運營策略》課件
- 2025年度農業保險合同
- 2025年特種設備安全管理人員(A證)考試試題(含答案)
- 污水處理廠突發環境事件應急預案(2022版)
- 2024年河北石家莊事業單位招聘考試真題答案解析
- 2025年中國郵政集團工作人員招聘考試筆試試題(含答案)
- 2025廣東二模語文試題及答案
- 高速公路安全防護網的施工方案
- 大部分分校:地域文化形考任務一-國開(CQ)-國開期末復習資料
評論
0/150
提交評論