⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dom_test.java

📁 Hibernate开发及整合应用大全 蔡雪焘编著 本书用典型的示例剖析Hibernate开发中的重点和难点
💻 JAVA
字号:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Vector;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
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;


public class DOM_test {
    Vector employ_Vector=new Vector();//保存员工信息
    DocumentBuilderFactory dbf=null;
    DocumentBuilder db = null;
    Document doc = null;

    DOM_test() {
        //为解析XML作准备,创建DocumentBuilderFactory实例,指定DocumentBuilder
        dbf= DocumentBuilderFactory.newInstance();
        try {
            db = dbf.newDocumentBuilder();
        } catch (ParserConfigurationException pce) {
            System.err.println(pce); //出异常时输出异常信息,然后退出,下同
            System.exit(1);
        }
    }

    //从info.xml中读取信息生成dom树,将employ对象集合存于Vector中
     private void readXMLFile(String inFile) throws Exception {
         try {
            doc = db.parse(inFile);
        } catch (DOMException dom) {
            System.err.println(dom.getMessage());
            System.exit(1);
        } catch (IOException ioe) {
            System.err.println(ioe);
            System.exit(1);
        }
        //    下面是解析XML的全过程,比较简单,先取根元素"employs"
        Element root = doc.getDocumentElement();
        //取"员工"元素列表
        NodeList employs = root.getElementsByTagName("employ");
        for (int i = 0; i < employs.getLength(); i++) {
            //依次取每个"员工"元素
            Element employ = (Element) employs.item(i);
            //创建一个员工的Bean实例
            EmployBean employBean = new EmployBean();
            //取员工的性别属性
            employBean.setSex(employ.getAttribute("sex"));
            /* 注意以下是在employ标签下取得属性,而不是在document范围下,因此
            *在此例中NodeList的length是1。xml文档中的空白符也会被作为对象映射在dom树中。
            *因而,直接调用node方法的getchildnodes方法
            *有时不能够返回所期望的nodelist对象。解决的办法是使用element的
            *getelementbytagname(string),然后用item()方法提取想要的元素。
            */  
            NodeList names = employ.getElementsByTagName("name");
            NodeList ages = employ.getElementsByTagName("age");
             //将属性值设入employ对象
            if (names.getLength() == 1) {
                Element e = (Element) names.item(0);
                Text t = (Text) e.getFirstChild();
                employBean.setName(t.getNodeValue());
            }
            if (ages.getLength() == 1) {
                Element e = (Element) ages.item(0);
                Text t = (Text) e.getFirstChild();
                employBean.setAge(Integer.parseInt(t.getNodeValue()));
            }

            employ_Vector.add(employBean);
        }
    }
     //从employ集合的Vector中一一取出对象,构造成XML文档并输出至info_copy.xml
    private void writeXMLFile(String outFile) throws Exception {
        //为解析XML作准备,创建DocumentBuilderFactory实例,指定DocumentBuilder
         doc = db.newDocument();

        //下面是建立XML文档内容的过程,先建立根元素"employs"
        Element root = doc.createElement("employs");
        //根元素添加上文档
        doc.appendChild(root);

        //取员工信息的Bean列表
        for (int i = 0; i < employ_Vector.size(); i++) {
            //依次取每个员工的信息
            EmployBean employBean = (EmployBean) employ_Vector.get(i);
            //建立"员工"元素,添加到根元素
            Element employ = doc.createElement("employ");
            employ.setAttribute("sex", employBean.getSex());
            root.appendChild(employ);
            //建立"姓名"元素,设置为员工属性
            Element name = doc.createElement("name");
            employ.appendChild(name);
            
            Text tName = doc.createTextNode(employBean.getName());
            name.appendChild(tName);
            /*对element中所包含的text(在dom中,这些text也是代表了一个node的,因此也必须为它们
             * 创建相应的node),不能直接用element对象的setnodevalue()方法来设置这些text的内容,
             * 而需要用创建的text对象的setnodevalue()方法来设置文本,这样才能够把创建的element和
             * 其文本内容添加到dom树中。
             */
            Element age = doc.createElement("age");
            employ.appendChild(age);
            Text tAge = doc
                    .createTextNode(String.valueOf(employBean.getAge()));
            age.appendChild(tAge);
        }
        /*这里的transformerfactory也同样应用了工厂模式,使得具体的代码同具体的变换器无关。
        *transformer类的transfrom方法接受两个参数、一个数据源source和一个输出目标result。
        *这里分别使用的是domsource和streamresult,这样就能够把dom的内容输出到一个输出流中,
        *当这个输出流是一个文件的时候,dom的内容就被写入到文件中去了
        */
        TransformerFactory tfactory =TransformerFactory.newInstance();
        Transformer transformer = tfactory.newTransformer();
        /*这里有一个小技巧,对document对象调用normalize(),可以去掉xml文档中作为格式
        *化内容的空白而映射在dom树中的不必要的text node对象。否则你得到的dom树可能
        *并不如你所想象的那样。特别是在输出的时候,这个normalize()更为有用。
        */
        doc.normalize(); 
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(new File("info_copy.xml"));
        transformer.transform(source, result);  

    }

    //最后加入运行的主函数,如下:
    public static void main(String[] args) throws Exception {
        //建立测试实例
        DOM_test dom_test = new DOM_test();
        System.out.println("开始读info.xml文件");
        dom_test.readXMLFile("info.xml");
        System.out.println("读入完毕,开始写info_copy.xml文件");
        dom_test.writeXMLFile("info_copy.xml");
        System.out.println("写入完成");

    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -