手记

XML之DOM方式读写文件

DOM方式解析文件时,一次性加载文件,形成树结构,保留在内存中,方便修改。但当XML文件较大时,对内存的耗费比较大,容易影响性能并发生溢出。不管是解析文件还是生成文件,都要先创建Document对象。

    public DocumentBuilder getDocumentBuilder() throws Exception{
        //创建一个DocumentBuilderFactory的对象
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        //创建一个DocumentBuilder的对象
        DocumentBuilder db = dbf.newDocumentBuilder();
        return db;
    }
1、DOM方式解析XML
getElementsByTagName("name");  获取name节点集合,返回NodeList
getAttributes();   获取节点的所有属性,返回NamedNodeMap
getNodeName();  获取节点、属性名
getNodeValue();  获取节点、属性值
getChildNodes();  获取子节点集合,返回NodeList
getTextContent();  获取节点的文本内容
getNodeType();  获取节点类型
    public void parseXML()throws Exception{
        DocumentBuilder db = getDocumentBuilder();
        //导入org.w3c.dom下的Document对象
        Document document = db.parse("books.xml");
        //获取book节点的集合
        NodeList booklist = document.getElementsByTagName("book");
        //获取book节点
        for(int i=0;i<booklist.getLength();i++){
            System.out.println("-----以下是第"+(i+1)+"本书的内容------");
            Node book = booklist.item(i);
            NamedNodeMap attrs = book.getAttributes(); //获取节点的所有属性
            System.out.println("第"+(i+1)+"本书有"+attrs.getLength()+"个属性");
            for(int j=0;j<attrs.getLength();j++){
                Node attr = attrs.item(j); //获取第j个节点属性
                System.out.print("属性名:"+attr.getNodeName());//获取属性名
                System.out.println("-->属性值:"+attr.getNodeValue());//获取属性值
            }
            //当已知book节点只有一个id属性的时候,可将book节点强制类型转换成Element类型
            //Element book1 = (Element)booklist.item(i);
            //通过getAttribute方法获取属性值
            //System.out.println(book1.getAttribute("id"));
            NodeList childNodes = book.getChildNodes();//获取book的子节点
            for(int k=0;k<childNodes.getLength();k++){
                //判断节点类型是元素节点,就输出节点名字和值
                if(childNodes.item(k).getNodeType() == Node.ELEMENT_NODE){
                    System.out.print("子节点名:"+childNodes.item(k).getNodeName());
                    //元素节点若直接使用getNodeValue获取值将返回null,必须将值作为子节点,再获取值 
                    //System.out.println("-->子节点值:"+childNodes.item(k).getFirstChild().getNodeValue());
                    //也可以直接用getTextContent方法,他将获取所有子节点的文本内容
                    System.out.println("-->子节点值:"+childNodes.item(k).getTextContent());
                }
            }
        }
2、DOM方式生成XML
createElement("name");  创建节点name
setAttribute("id", "1");  给节点设置属性名为id、属性值为1
setTextContent("Java程序设计教程");  设置节点的文本内容
appendChild(name1);  将子节点添加到节点中

除了常用的方法之外,还要创建Transformer对象,用于生成XML文档

    public void createXML() throws Exception {
        DocumentBuilder db = getDocumentBuilder();
        Document document = db.newDocument();
        document.setXmlStandalone(true);//xml文件的standalone为yes且不显示
        Element bookstore = document.createElement("bookstore");//创建根节点bookstore
        Element book1 = document.createElement("book");//创建子节点book
        Element book2 = document.createElement("book");//创建子节点book
        book1.setAttribute("id", "1");//给book设置属性名和属性值
        book2.setAttribute("id", "2");//给book设置属性名和属性值
        Element name1 = document.createElement("name");
        Element name2 = document.createElement("name");
        name1.setTextContent("Java程序设计教程");
        name2.setTextContent("C语言程序设计");
        book1.appendChild(name1);//将name添加到book节点中
        book2.appendChild(name2);//将name添加到book节点中
        bookstore.appendChild(book1);//将book节点添加到根节点中
        bookstore.appendChild(book2);//将book节点添加到根节点中
        document.appendChild(bookstore);//将根节点添加到DOM树中

        //创建TransformerFactory对象
        TransformerFactory tff = TransformerFactory.newInstance();
        //创建Transformer对象
        Transformer tf = tff.newTransformer();
        tf.setOutputProperty(OutputKeys.INDENT, "yes");//生成的XML文件标签会换行
        tf.transform(new DOMSource(document), new StreamResult(new File("books1.xml")));
    }

注:文章根据本站相关课程的学习笔记整理而来,有错误或其他任何问题敬请指正,欢迎共同学习交流!

1人推荐
随时随地看视频
慕课网APP