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 阅读(3551) 评论(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.文档教程

友情链接

搜索

最新评论