用DOM处理XML文档(Java实现)

 

一、学生

package book.xml;

/**
 * 描述学生的JavaBean
 * @author wuhailin
 *
 */
public class StudentBean {

 private String name;
 private String gender;
 private int age;
 private String phone;
 public String toString(){
  StringBuffer sb=new StringBuffer();
  sb.append("姓名:").append(this.name).append("; ");
  sb.append("性别:").append(gender).append("; ");
  sb.append("年龄:").append(age).append("; ");
  sb.append("电话").append(phone);
  return sb.toString();
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
 public String getGender() {
  return gender;
 }
 public void setGender(String gender) {
  this.gender = gender;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getPhone() {
  return phone;
 }
 public void setPhone(String phone) {
  this.phone = phone;
 }
}

二、处理

package book.xml;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;

/**
 * 用DOM处理XML文档
 * @author wuhailin
 *
 */
public class DomXML {

 public static List readXMLFile(String inFile)throws Exception{
  //得到DOM解析器的工厂实例
  DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
  DocumentBuilder db=null;
  try{
   //从DOM工厂中获得DOM解析器
   db=dbf.newDocumentBuilder();
  }catch(ParserConfigurationException pce){
   System.err.println(pce);
   return null;
  }
  Document doc=null;
  try{
   //解析XML文档的输入流,得到一个Document
   doc=db.parse(inFile);
   //对document对象调用normalize(),可以去掉XML文档中作为格式化内容
   //的空白,避免了这些空白映射在dom中成为不必要的text node对象
   //否则,得到dom树可能不是你所想象的
   doc.normalize();
  }catch(DOMException dom){
   System.err.println(dom);
   return null;
  }catch(IOException ioe){
   System.err.println(ioe);
   return null;
  }
  List studentBeans=new ArrayList();
  StudentBean studentBean=new StudentBean();
  Element root=doc.getDocumentElement();//得到XML文档的根节点"学生花名册"
  
  NodeList students=root.getElementsByTagName("学生");
  //取"学生 "元素列表
  for(int i=0;i<students.getLength();i++){
   Element student=(Element)students.item(i);//依次取每个"学生"元素
   studentBean=new StudentBean();
   studentBean.setGender(student.getAttribute("性别"));
   
   NodeList names=student.getElementsByTagName("姓名");
   if(names.getLength()==1){
    Element e=(Element)names.item(0);
    Text t=(Text)e.getFirstChild();
    studentBean.setName(t.getNodeValue());
   }
   NodeList ages=student.getElementsByTagName("年龄");
   if(ages.getLength()==1){
    Element e=(Element)ages.item(0);
    Text t=(Text)e.getFirstChild();
    studentBean.setAge(Integer.parseInt(t.getNodeValue()));
   }
   NodeList phones=student.getElementsByTagName("电话");
   if(phones.getLength()==1){
    Element e=(Element)phones.item(0);
    Text t=(Text)e.getFirstChild();
    studentBean.setPhone(t.getNodeValue());
   }
   studentBeans.add(studentBean);
  }
  return studentBeans;
 }
 /**
  * 用DOM写XML文档,把学生信息以XML文档的形势存储
  * @param outFile 输出XML文档的路径
  * @param studentGeans 学生信息
  * @return
  * @throws Exception
  */
 public static String writeXMLFile(String outFile,List studentGeans)throws Exception{
  //为解析XML文件做准备,创建DocumentBuilderFactory实例,指定DocumentBuilder
  DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
  DocumentBuilder db=null;
  try{
   db=dbf.newDocumentBuilder();
  }catch(ParserConfigurationException pce){
   System.err.println(pce);
   return null;
  }
  //创建一个空文档
  Document doc=null;
  doc=db.newDocument();
  //下面是建立XML文档内容的过程
  //先建立根元素"学生花名册",并添加到文档中
  Element root=doc.createElement("学生花名册");
  doc.appendChild(root);
  
  //取学生信息的Bean列表
  for(int i=0;i<studentGeans.size();i++){
   //依次取每个学生的信息
   StudentBean studentBean=(StudentBean)studentGeans.get(i);
   //建立学生元素,有一个性别属性,然后添加到根元素
   Element student=doc.createElement("学生");
   student.setAttribute("性别",studentBean.getGender());
   root.appendChild(student);
   
   //建立姓名元素,添加到学生下面
   Element 姓名");
   student.appendChild(name);
   //为姓名元素赋值
   Text tName=doc.createTextNode(studentBean.getName());
   name.appendChild(tName);
   //建立年龄元素,添加到学生下面
   Element age=doc.createElement("年龄");
   student.appendChild(age);
   //为学生元素赋值
   Text tAge=doc.createTextNode(String.valueOf(studentBean.getAge()));
   age.appendChild(tAge);
   //建立电话元素,添加到学生下面
   Element phone=doc.createElement("电话");
   student.appendChild(phone);
   //为电话元素赋值
   Text tPhone=doc.createTextNode(studentBean.getPhone());
   student.appendChild(tPhone);
   phone.appendChild(tPhone);
   
  }
  //将XML文档输出到指定的文件
  return domDocToFile(doc,outFile,"GB2312");
 }
 /**
  * 使用JAXP将DOM对象写到XML文档里
  * @param doc DOM的文档对象
  * @param fileName 写入的XML文档路径
  * @param encoding XML文档的编码
  * @return
  * @throws TransformerException
  */
 public static String domDocToFile(Document doc,String fileName,String encoding)throws TransformerException{
  //首先创建一个TransformerFactory对象,再由此创建Transformer对象
  //Transformer类相当于一个XSLT引擎,通常我们使用它来处理XSL文件
  //在这里我们使用它输出XML文档
  TransformerFactory tFactory=TransformerFactory.newInstance();
  Transformer transformer=tFactory.newTransformer();
  //获取Transformser对象的输出属性,亦即XSLT引擎的默认值输出属性,是java.util.properties
  Properties properties=transformer.getOutputProperties();
  //设置新的输出属性:输出字符为GB2312,这样可以支持中文
  //XSLT引擎所输出的XML如果包含了中文字符,可以正常显示
  properties.setProperty(OutputKeys.ENCODING,encoding);
  //这里设置输出为XML格式,实际上是XSTL引擎的默认输出格式
  properties.setProperty(OutputKeys.METHOD,"xml");
  transformer.setOutputProperties(properties);
  //创建一个DOMSource对象,该构造函数的参数可以是一个Document对象
  DOMSource source=new DOMSource(doc);
  //创建XSLT引擎的输出对象,这里将输出写入文件
  File file=new File(fileName);
  StreamResult result=new StreamResult(file);
  
  transformer.transform(source,result);
  //将输出文件的路径返回
  return file.getAbsolutePath();
 }
 public static void main(String[] args) {
  String inFileName="student.xml";
  String outFileName="students_new.xml";
  try{
   List studentBeans=DomXML.readXMLFile(inFileName);
   DomXML.writeXMLFile(outFileName,studentBeans);
  }catch(Exception e){
   e.printStackTrace();
  }
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值