DOM对象对xml文件的读取和写入

解析的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();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/n15642656987/article/details/71699019
今日推荐