解析的XML文件对应的java类
package com.nm;
public class Employee {
private String eid;
private String name;
private String gender;
private int age;
private String address;
@Override
public String toString() {
return "Employee [eid=" + eid + ", name=" + name + ", gender=" + gender
+ ", age=" + age + ", address=" + address + "]";
}
public String getEid() {
return eid;
}
public void setEid(String eid) {
this.eid = eid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Employee(String eid, String name, String gender, int age,
String address) {
super();
this.eid = eid;
this.name = name;
this.gender = gender;
this.age = age;
this.address = address;
}
public Employee() {
super();
// TODO Auto-generated constructor stub
}
}
操作XML文件的TestXml类
package com.nm;
import java.io.File;
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.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.*;
public class TestXml {
/***
* 读取xml文件
* @param fileName
* @return employees
* @throws Exception
*/
public static List<Employee> readXMLFile(String fileName)
throws Exception{
//得到dom解析器的工厂实例
DocumentBuilderFactory dbf =
DocumentBuilderFactory.newInstance();
DocumentBuilder bulid = null;
try{
//从dom工厂对象获取dom解析器
bulid = dbf.newDocumentBuilder();
}catch(Exception e){
e.printStackTrace();
return null;
}
Document doc = null;
try{
//解析xml文档的document对象
doc = bulid.parse(fileName);
//去掉xml文档中格式化内容空白
doc.normalize();
}catch(Exception dom){
dom.printStackTrace();
}
//创建employee的集合
List<Employee> employees =
new ArrayList<Employee>();
//创建employee对象
Employee employee = null;
//获取xml文档的根节点
Element root = doc.getDocumentElement();
//获取xml文档employee元素节点集合
NodeList nodeList =
root.getElementsByTagName("employee");
//遍历employee元素下的节点
for(int i=0;i<nodeList.getLength();i++){
//依次获取每个employee元素
Element element = (Element) nodeList.item(i);
//创建一个员工对象
employee = new Employee();
//给员工的编号属性赋值
employee.setEid(element.getAttribute("id"));
//给员工的性别属性赋值
employee.setGender(element.getAttribute("gender"));
//取员工名字元素
NodeList name = element.getElementsByTagName("name");
if(name.getLength() == 1){
Element e = (Element) name.item(0);
//取名字元素的第一个子节点,就是名字的值节点
Text t = (Text) e.getFirstChild();
//给员工的姓名属性赋值
employee.setName(t.getNodeValue());
}
//取员工年龄元素
NodeList age = element.getElementsByTagName("age");
if(age.getLength() == 1){
Element e = (Element) age.item(0);
//取年龄元素的第一个子节点,就是年龄的值节点
Text t = (Text) e.getFirstChild();
//给员工的年龄属性赋值
employee.setAge(Integer.parseInt(t.getNodeValue()));
}
//取员工地址元素
NodeList address = element.getElementsByTagName("address");
if(address.getLength() == 1){
Element e = (Element) address.item(0);
//取地址元素的第一个子节点,就是地址的值节点
Text t = (Text) e.getFirstChild();
//给员工的地址属性赋值
employee.setAddress(t.getNodeValue());
}
//将employee塞入list集合中
employees.add(employee);
}
return employees;
}
/***
* 用dom写xml文档,把员工信息以xml文档的形式存储
* @param outFile
* @param employees
* @return domDocToFile(doc, outFile, outFile)
* @throws Exception
*/
public static String wirteXMLFile(String outFile,List<Employee> employees)
throws Exception{
//得到dom解析器的工厂实例
DocumentBuilderFactory dbf =
DocumentBuilderFactory.newInstance();
DocumentBuilder bulid = null;
try{
//从dom工厂对象获取dom解析器
bulid = dbf.newDocumentBuilder();
}catch(Exception e){
e.printStackTrace();
return null;
}
//新建一个空白文档
Document doc = bulid.newDocument();
//建立根元素employees
Element root = doc.createElement("employees");
//将根节点添加进入文档
doc.appendChild(root);
//循环获取员工的信息
for(int i=0;i<employees.size();i++){
//依次获取员工的信息
Employee emp = employees.get(i);
//创建employee元素,有编号和性别属性
Element element = doc.createElement("employee");
//设置编号和性别
element.setAttribute("id", emp.getEid());
element.setAttribute("gender", emp.getGender());
root.appendChild(element);
//创建name元素
Element name = doc.createElement("name");
//将name元素添加如employee元素下
element.appendChild(name);
//往name元素中属性赋值
Text tname = doc.createTextNode(emp.getName());
//将属性值添加如name元素中
name.appendChild(tname);
//创建age元素
Element age = doc.createElement("age");
//将age元素添加如employee元素下
element.appendChild(age);
//往age元素中属性赋值
Text tage = doc.createTextNode(""+emp.getAge());
//将属性值添加如age元素中
name.appendChild(tage);
//创建address元素
Element address = doc.createElement("address");
//将age元素添加如employee元素下
element.appendChild(address);
//往age元素中属性赋值
Text taddress = doc.createTextNode(""+emp.getAddress());
//将属性值添加如age元素中
name.appendChild(taddress);
}
return domDocToFile(doc, outFile, outFile);
}
/***
* 使用jaxp将dom对象写入xml文档中
* @param doc
* @param fileName
* @param encoding
* @return file.getAbsolutePath()
* @throws TransformerException
*/
public static String domDocToFile(Document doc,String fileName,String encoding)
throws TransformerException{
//为了得到xslt引擎创建对象
TransformerFactory tff =
TransformerFactory.newInstance();
//创建xslt引擎对象输出xml文档
Transformer tf = tff.newTransformer();
//获取属性对象
Properties pro = tf.getOutputProperties();
//设置编码格式和输出格式
pro.setProperty(OutputKeys.ENCODING, encoding);
pro.setProperty(OutputKeys.METHOD, "xml");
tf.setOutputProperties(pro);
//创建资源对象
DOMSource source = new DOMSource(doc);
//创建文件对象
File file = new File(fileName);
//获得输出对象
StreamResult result = new StreamResult(file);
//结果输出到控制台
StreamResult result1 = new StreamResult(System.out);
//执行dom文档到xml文件转换
tf.transform(source, result);
//文档输出到控制台
tf.transform(source, result1);
System.out.println();
//将输出文件的路径返回
return file.getAbsolutePath();
}
public static void main(String[] args) {
String in = "H:test.xml";
String out = "H:test1.xml";
try{
List<Employee> emps = TestXml.readXMLFile(in);
System.out.println("输出到控制台的xml文档:");
System.out.println("文件(包括路径和后缀):"+TestXml.wirteXMLFile(out, emps));
}catch(Exception e){
e.printStackTrace();
}
}
}