blogjava's web log

          blogjava's web log
          ...

          XML在Java中的應(yīng)用

          目標(biāo)

          了解解析器
          DOM的使用
          一個(gè)例子--java中操作xml|(添加。刪除 和顯示)

          解析器概述

          1.解析是讀取文檔并分解為元素的過(guò)程

          1.1 XML處理器(通常稱為解析器)
          ??? ---Web 應(yīng)用程序的基本構(gòu)建快
          ??? ----解析 XML 并為應(yīng)用程序提供其所需的信息
          解析器的類型
          ?進(jìn)行驗(yàn)證的解析器
          ?? ----檢查 XML 文檔的有效性和格式規(guī)范
          1.2.2不進(jìn)行驗(yàn)證的解析器
          ------檢查 XML 文檔的格式規(guī)范

          可用的 XML 軟件包:
          ?---Sun 公司的 Java Project X 包
          ? ---IBM 公司的 XML4J v2 包
          ?---Oracle 公司的 v2 XML 包
          ?---James Clark 的 XP 解析器

          XML解析器包


          解析器?????????? 包名
          Java Project X?? javax.xml.parsers
          IBM XML4J?? com.ibm.xml.parsers.SAXParser
          ????????????????? com.ibm.xml.parsers.ValidatingSAXParser
          Oracle?????????? oracle.xml.parser.v2.SAXParser
          XP?????????? com.jclark.xml.sax.Driver


          XML 軟件包支持的 API:
          ---用于 XML 的簡(jiǎn)單 API(SAX)
          ----文檔對(duì)象模型 (DOM)
          -----定義用于說(shuō)明 DOM 重要區(qū)域的 API
          -----構(gòu)建于 DOM 頂層的 API


          文檔對(duì)象模型
          ?? --- 定義一組 Java 接口
          ?? ----基于對(duì)象
          ?? ---與語(yǔ)言和平臺(tái)無(wú)關(guān)
          ?? ----將 XML 文檔表示為樹(shù)
          ?? --- 在內(nèi)存中解析和存儲(chǔ) XML 文檔
          ?? --- 允許隨機(jī)訪問(wèn)文檔的不同部分

          如:
          department.xml
          <? xml?version="1.0" ?>
          < Department >
          ????
          < Student >
          ????????
          < Name > 吳軍 </ Name >
          ????????
          < E-mail > wujun1866@gmail.com </ E-mail >
          ????
          </ Student >
          ????
          < Student >
          ????????
          < Name > wujun </ Name >
          ????????
          < E-mail > wujun1866@gmail.com </ E-mail >
          ????
          </ Student >
          </ Department >

          使用?DOM?解析?XML?文檔
          ---- 獲得一個(gè)新?DocumentBuilderFactory?實(shí)例
          ---- 使用?DocumentBuilderFactory?構(gòu)建?DocumentBuilder
          ---- 使用?DocumentBuilder的?parse(?)?方法解析文件
          ---- 將已解析的文檔存儲(chǔ)在?Document?對(duì)象中
          ---- 使用?getElementsByTagName(?)?方法獲得元素


          將XML文件轉(zhuǎn)化成DOM文檔


          // 獲得一個(gè)XML文件的解析器
          ?DocumentBuilderFactory?factory? = ?DocumentBuilderFactory.newInstance

          ();


          ?
          // 解析XML文件生成DOM文檔的接口類,以便訪問(wèn)DOM。?
          DocumentBuilder?builder? = ????factory.newDocumentBuilder();
          document?
          = ?builder.parse(? new ?File(FileName)?);?

          遍歷DOM文檔?


          // 獲得Root元素?
          Element?element? = ?document.getDocumentElement();?
          // 獲得Root元素的子節(jié)點(diǎn)列表
          ?nodelist? = ?element.getChildNodes();
          ?
          // 用遞歸方法實(shí)現(xiàn)DOM文檔的遍歷
          ?GetElement(nodelist);?


          修改DOM文檔

          // ?獲得Root對(duì)象
          ?Element?root? = ?document.getDocumentElement();?
          // ?在DOM文檔中增加一個(gè)Element節(jié)點(diǎn)
          ?Element?booktype? = ?document.createElement( " COMPUTES " );
          ?
          // 將該節(jié)點(diǎn)轉(zhuǎn)化成root對(duì)象的子節(jié)點(diǎn)
          ?root.appendChild(cdrom);?
          // 在DOM文檔中增加一個(gè)Element節(jié)點(diǎn)?
          Element?booktitle? = ?document.createElement( " Title " );
          ?
          // 將該節(jié)點(diǎn)轉(zhuǎn)化成booktype對(duì)象的子節(jié)點(diǎn)
          ?booktype.appendChild(booktitle);?
          // 在DOM文檔中增加一個(gè)Text節(jié)點(diǎn)
          ?Text?bookname? = ?document.createTextNode( " understand?Corba " );?
          // 將該節(jié)點(diǎn)轉(zhuǎn)化成bookname對(duì)象的子節(jié)點(diǎn)?
          booktitle.appendChild(bookname);?


          將DOM文檔轉(zhuǎn)化成XML文件?

          // 獲得將DOM文檔轉(zhuǎn)化為XML文件的轉(zhuǎn)換器,在jdk1.4中,有類

          TransformerFactory??來(lái)實(shí)現(xiàn)

          ?TransformerFactory?tfactory?
          = ?TransformerFactory.newInstance();?
          Transformer?transformer?
          = ?tfactory.newTransformer();?

          // ?將DOM對(duì)象轉(zhuǎn)化為DOMSource類對(duì)象,該對(duì)象表現(xiàn)為轉(zhuǎn)化成別的表達(dá)形式的信

          息容器。
          ?DOMSource?source?
          = ? new ?DOMSource(document);?
          // ?獲得一個(gè)StreamResult類對(duì)象,該對(duì)象是DOM文檔轉(zhuǎn)化成的其他形式的文檔的

          容器,可以是XML文件,文本文件,HTML文件。
          這里為一個(gè)XML文件。
          ?StreamResult?result?
          = ? new ?StreamResult( new ?File(“text.xml”));?
          // ?調(diào)用API,將DOM文檔轉(zhuǎn)化成XML文件。?
          transformer.transform(source,result);?

          下面來(lái)看個(gè)例子 界面如下


          首先 單擊創(chuàng)建xml文件。將在C盤(pán)創(chuàng)建一個(gè)名為student.xml文件 代碼如下|:
          ?void?btnCreateXml_actionPerformed(ActionEvent?e)?{
          ????
          ????
          //創(chuàng)建xml文件
          ???org.w3c.dom.Document?dt=null;
          ???javax.xml.parsers.DocumentBuilderFactory?dbf
          =javax.xml.parsers.DocumentBuilderFactory.newInstance()?;
          ??
          try?{
          ????javax.xml.parsers.DocumentBuilder?db?
          =?dbf.newDocumentBuilder();
          ????dt
          =db.newDocument()?;
          ???
          //?dt.set
          ????org.w3c.dom.Element?ele1=dt.createElement("students");
          ???
          //?org.w3c.dom.Element?ele2=dt.createElement("student");
          ???
          //?ele1.appendChild(ele2);
          ????ele1.setAttribute("id"?,"101")?;
          ????dt.appendChild(ele1);

          ???javax.xml.transform.Transformer?tf
          =null;
          ???javax.xml.transform.dom.DOMSource?dm?
          =new?javax.xml.transform.dom.DOMSource(dt);
          ???java.io.File?file
          =new?java.io.File("c:/student.xml");

          ???javax.xml.transform.TransformerFactory?tff
          =javax.xml.transform.TransformerFactory?.newInstance()?;
          ??
          try?{
          ????tf?
          =?tff.newTransformer();
          ????
          try?{
          ??????tf.transform(dm,?
          new?javax.xml.transform.stream.StreamResult(file));
          ????}

          ????
          catch?(TransformerException?ex3)?{
          ????}

          ??}

          ??
          catch?(TransformerConfigurationException?ex1)?{
          ??}

          ??}

          ??
          catch?(ParserConfigurationException?ex)?{
          ????System.out.print(ex.getMessage()?);
          ??}

          ??}


          然后輸入相應(yīng)的內(nèi)容。。點(diǎn)擊添加到xml文件.數(shù)據(jù)將添加到xml文件了代碼如下:

          當(dāng)點(diǎn)擊查看xml內(nèi)容時(shí)。。jtable將顯示所有Student.xml中的內(nèi)容。。代碼如下
          先定義個(gè)公共方法。。因?yàn)榈认聞h除的時(shí)候還要用到這方法..
          ShowxmlDate。。
          ?void?ShowxmlDate()
          ????
          {
          ??????org.w3c.dom.Document?dt
          =null;
          ??????javax.swing.table.DefaultTableModel?dtm
          =null;
          ??????java.util.Vector?vc
          =new?java.util.Vector?();
          ??????java.util.Vector?vcc
          =new?java.util.Vector?();
          ??????vcc.add(
          "姓名");
          ??????vcc.add(
          "年齡");
          ??????vcc.add(
          "地址");
          ??????vcc.add(
          "電話");
          ??javax.xml.parsers.DocumentBuilderFactory?dbf
          =javax.xml.parsers.DocumentBuilderFactory.newInstance()?;
          ?????java.io.File?file
          =new?java.io.File("c:/student.xml");
          ??
          ?????
          try?{
          ???????javax.xml.parsers.DocumentBuilder?db?
          =?dbf.newDocumentBuilder();
          ?????????
          try?{
          ???????????dt?
          =?db.parse(file);
          ????????org.w3c.dom.NodeList???nl
          =dt.getDocumentElement().getChildNodes()??;
          ??????????
          for(int?i=0;i<nl.getLength()?;i++)
          ??????????
          {
          ????????????org.w3c.dom.Element?ele
          =(org.w3c.dom.Element)nl.item(i);
          ????????????org.w3c.dom.NodeList???nodes
          =ele.getChildNodes()???;
          ?????????????
          //?for(int?ii=0;ii<nodes.getLength()?;ii++)
          ????????????
          //??{
          ?????????????
          //???org.w3c.dom.Element?ele1=(Element)nl.item(ii);
          ?????????????
          //?}
          ?????????????java.util.Vector?vc1=new?java.util.Vector?();
          ?????????????vc1.add(nodes.item(
          0).getFirstChild().getNodeValue())?;
          ?????????????vc1.add(nodes.item(
          1).getFirstChild().getNodeValue())?;
          ?????????????vc1.add(nodes.item(
          2).getFirstChild().getNodeValue())?;
          ?????????????vc1.add(nodes.item(
          3).getFirstChild().getNodeValue())?;
          ?????????????vc.add(vc1);
          ??????????dtm
          =new?javax.swing.table.DefaultTableModel?(vc,vcc);
          ??????????
          this.jTable1?.setModel(dtm);
          ??????????}

          ??
          ?????????}

          ?????????
          catch?(java.io.IOException?ex1)?{
          ???????????System.out.print(ex1.getMessage()?);
          ?????????}

          ?????????
          catch?(SAXException?ex2)?{
          ????????????System.out.print(ex2.getMessage()?);
          ?????????}

          ?????}

          ?????
          catch?(ParserConfigurationException?ex)?{
          ????????System.out.print(ex.getMessage()?);
          ?????}

          ??
          ??
          ??}

          再在顯示xml數(shù)據(jù)按鈕單擊事件掉用上面的方法就可以了。。
          ??void?btnShowxml_actionPerformed(ActionEvent?e)?{
          ????
          this.ShowxmlDate();
          ??}

          如圖..顯示剛剛添加的數(shù)據(jù)..


          當(dāng)點(diǎn)刪除時(shí),將把選中的數(shù)據(jù)從xml文件中刪除此條記錄..代碼如下
          public?void?btnDelete_actionPerformed(ActionEvent?actionEvent)?{
          ????org.w3c.dom.Document?dt
          =null;
          ??javax.xml.parsers.DocumentBuilderFactory?dbf
          =javax.xml.parsers.DocumentBuilderFactory.newInstance()?;
          ??java.io.File?file
          =new?java.io.File("c:/student.xml");
          ??
          try?{
          ???javax.xml.parsers.DocumentBuilder?db?
          =?dbf.newDocumentBuilder();
          ??????
          try?{
          ????????dt?
          =?db.parse(file);
          ????????org.w3c.dom.NodeList???nl
          =dt.getDocumentElement().getChildNodes()??;
          ????????System.out.print(nl.getLength()?);
          ??????
          for(int?i=0;i<nl.getLength()?;i++)
          ???
          //????dt.getElementsByTagNameNS("student","ff");
          ?????{
          ???????org.w3c.dom.Element?ele
          =(org.w3c.dom.Element)nl.item(i);
          ????
          if(ele.getChildNodes().item(0).getFirstChild().getNodeValue().equals(aa)??)
          ?????
          //??org.w3c.dom.NodeList??nodes=ele.getChildNodes()???;
          ?????{
          ???????dt.getDocumentElement().removeChild(nl.item(i))?;
          ?????}

          ?????
          else
          ?????
          {
          ?????System.out.print(
          "null");
          ?????}

          ?????}

          ?????javax.xml.transform.Transformer?tf
          =null;
          ???javax.xml.transform.dom.DOMSource?dm?
          =new?javax.xml.transform.dom.DOMSource(dt);
          ????javax.xml.transform.TransformerFactory?tff
          =javax.xml.transform.TransformerFactory?.newInstance();
          ????
          try?{
          ??????tf?
          =?tff.newTransformer();
          ??????
          try?{
          ????????tf.transform(dm,?
          new?javax.xml.transform.stream.StreamResult(file));
          ??????}

          ??????
          catch?(TransformerException?ex3)?{
          ??????}

          ?????
          this.ShowxmlDate();
          ????}

          ????
          catch?(TransformerConfigurationException?ex2)?{
          ????}

          ??????}

          ??????
          catch?(IOException?ex1)?{
          ??????}

          ??????
          catch?(SAXException?ex1)?{
          ??????}

          ??}

          ??
          catch?(ParserConfigurationException?ex)?{
          ??}


          ??}

          }


          提示
          要用導(dǎo)入的包
          import?java.awt.*;
          import?java.awt.event.*;
          import?javax.swing.*;
          javax.xml.parsers.ParserConfigurationException;
          import?javax.xml.transform.*;
          import?java.io.*;
          import?org.xml.sax.*;
          import?org.w3c.dom.*;
          import?java.awt.Font;
          import?java.awt.Dimension;
          import?java.awt.Rectangle;

          //在類里面還定義了一個(gè)全局變量。

          ?
          private?String?aa="";

          好了。到這就差不多了。。


          專家多指點(diǎn)。。

          posted on 2006-04-12 00:42 record java and net 閱讀(3571) 評(píng)論(2)  編輯  收藏 所屬分類: java

          評(píng)論

          # re: XML在Java中的應(yīng)用 2006-04-12 08:33 kinda

          不錯(cuò)。。

          就是沒(méi)有看懂。。

          太菜了,,沒(méi)有辦法。  回復(fù)  更多評(píng)論   

          # re: XML在Java中的應(yīng)用 2006-04-17 12:00 Steve

          你的CODE STYLE不好,不用的COMMENT 就DELET, 留在那里又不說(shuō)為什么. 而且你也沒(méi)有加VALIDATA OPETION,而且你也沒(méi)有SET NORMALIZE.  回復(fù)  更多評(píng)論   

          導(dǎo)航

          常用鏈接

          留言簿(44)

          新聞檔案

          2.動(dòng)態(tài)語(yǔ)言

          3.工具箱

          9.文檔教程

          友情鏈接

          搜索

          最新評(píng)論

          主站蜘蛛池模板: 上犹县| 衡东县| 湖北省| 徐闻县| 禹州市| 四子王旗| 清河县| 和静县| 武陟县| 嘉峪关市| 镇安县| 收藏| 北宁市| 漯河市| 淳化县| 安顺市| 桑植县| 湖南省| 南召县| 莱西市| 巴彦淖尔市| 增城市| 元阳县| 佛坪县| 永德县| 安远县| 黔南| 红安县| 新竹市| 夹江县| 铁岭市| 百色市| 富锦市| 永城市| 米林县| 杭锦旗| 恩施市| 会泽县| 遵义县| 神木县| 黔西|