blogjava's web log

          blogjava's web log
          ...

          XML在Java中的應用

          目標

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

          解析器概述

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

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

          可用的 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 的簡單 API(SAX)
          ----文檔對象模型 (DOM)
          -----定義用于說明 DOM 重要區域的 API
          -----構建于 DOM 頂層的 API


          文檔對象模型
          ?? --- 定義一組 Java 接口
          ?? ----基于對象
          ?? ---與語言和平臺無關
          ?? ----將 XML 文檔表示為樹
          ?? --- 在內存中解析和存儲 XML 文檔
          ?? --- 允許隨機訪問文檔的不同部分

          如:
          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?文檔
          ---- 獲得一個新?DocumentBuilderFactory?實例
          ---- 使用?DocumentBuilderFactory?構建?DocumentBuilder
          ---- 使用?DocumentBuilder的?parse(?)?方法解析文件
          ---- 將已解析的文檔存儲在?Document?對象中
          ---- 使用?getElementsByTagName(?)?方法獲得元素


          將XML文件轉化成DOM文檔


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

          ();


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

          遍歷DOM文檔?


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


          修改DOM文檔

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


          將DOM文檔轉化成XML文件?

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

          TransformerFactory??來實現

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

          // ?將DOM對象轉化為DOMSource類對象,該對象表現為轉化成別的表達形式的信

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

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

          下面來看個例子 界面如下


          首先 單擊創建xml文件。將在C盤創建一個名為student.xml文件 代碼如下|:
          ?void?btnCreateXml_actionPerformed(ActionEvent?e)?{
          ????
          ????
          //創建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()?);
          ??}

          ??}


          然后輸入相應的內容。。點擊添加到xml文件.數據將添加到xml文件了代碼如下:

          當點擊查看xml內容時。。jtable將顯示所有Student.xml中的內容。。代碼如下
          先定義個公共方法。。因為等下刪除的時候還要用到這方法..
          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數據按鈕單擊事件掉用上面的方法就可以了。。
          ??void?btnShowxml_actionPerformed(ActionEvent?e)?{
          ????
          this.ShowxmlDate();
          ??}

          如圖..顯示剛剛添加的數據..


          當點刪除時,將把選中的數據從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)?{
          ??}


          ??}

          }


          提示
          要用導入的包
          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;

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

          ?
          private?String?aa="";

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


          專家多指點。。

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

          評論

          # re: XML在Java中的應用 2006-04-12 08:33 kinda

          不錯。。

          就是沒有看懂。。

          太菜了,,沒有辦法。  回復  更多評論   

          # re: XML在Java中的應用 2006-04-17 12:00 Steve

          你的CODE STYLE不好,不用的COMMENT 就DELET, 留在那里又不說為什么. 而且你也沒有加VALIDATA OPETION,而且你也沒有SET NORMALIZE.  回復  更多評論   

          導航

          常用鏈接

          留言簿(44)

          新聞檔案

          2.動態語言

          3.工具箱

          9.文檔教程

          友情鏈接

          搜索

          最新評論

          主站蜘蛛池模板: 贺兰县| 盘锦市| 岳池县| 扎鲁特旗| 台中市| 阿拉善左旗| 那曲县| 霍林郭勒市| 通化县| 长岭县| 定南县| 长宁县| 双桥区| 防城港市| 宣城市| 金华市| 紫金县| 体育| 台湾省| 六盘水市| 蒙山县| 东源县| 东丰县| 五峰| 中方县| 连江县| 麻阳| 江都市| 岗巴县| 南雄市| 伊金霍洛旗| 香港 | 荣昌县| 时尚| 洛阳市| 朝阳县| 鄢陵县| 九龙城区| 晋江市| 茶陵县| 南川市|