一、学生
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();
}
}
}
文章出处:DIY部落(http://www.diybl.com/course/3_program/java/javaxl/20090302/156325.html)