DOM实现对XML的读写(1/4——XML读写篇)

今天花了老半天终于是搞懂了用DOM来读写XML

对于读取XML,利用迭代写了一个方法,实现了给一个根节点就能读取其下所有子节点,子节点的子节点的属性及属性值,还有节点间文本

package DOMTest;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

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.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class DOMTest {
    
    /**
     * DOM实现XML的读取
     * 读取分为标签,标签属性
     * 标签间内容
     */
    public void readXML() {
        //1.调用静态方法实例化一个DocumentBuilderFactory
        DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
        //2.随之创建一个DoucmentBuilder对象
        try {
            DocumentBuilder db=dbf.newDocumentBuilder();
        //3.使用DocumentBuilder对象来进行解析文件,返回一个Document对象
            Document dm=db.parse("res/book.xml");
        //4.对Document对象进行层层解析
            //最外层,根节点,每一个节点自己的属性和名称
            NodeList genList=dm.getChildNodes();
            getAttr(genList);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //有这个方法对于任何一个xml都可以读取出来,但是应该只适用于小文件
    public void getAttr(NodeList nl) {
        //传入的是一个节点列需要遍历处理,获取属性和属性值
        if(nl.getLength()==0){
            System.out.println("该节点没有子节点");
        }else{
            for(int i=0;i<nl.getLength();i++){
                int num=0;
                Node node=nl.item(i);
                //取到单个节点,且过滤掉空白文档
                if(node.getNodeType()!=Text.TEXT_NODE){
                    
                System.out.print("节点:\t"+node.getNodeName());
                NamedNodeMap nnm=node.getAttributes();
                    num=nnm.getLength();
                    if(num==0){
                        System.out.print("(无属性值)");
                    }else{
                        for(int j=0;j<num;j++){
                            Node item=nnm.item(j);
                            System.out.print("\t属性名称:"+item.getNodeName()+"--\t属性值:"+item.getNodeValue());
                                }
                        }
                    NodeList itList=node.getChildNodes();
                    getAttr(itList);
                }else{
                    System.out.print("\t\t"+node.getTextContent());
                    }
                }
        }
    }
    /**
     * DOM实现XML的写入
     * 
     */
    public void writerXML(){
        //和读取基本是相似的
        //先创建dbf
        DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
        //创建db
        try {
            DocumentBuilder db=dbf.newDocumentBuilder();
        //读取时是用parser读取Document,现在是用创建Document
            Document doc=db.newDocument();
        //先放在这,建XML树
            Element e0=doc.createElement("bookstore");
            //加一本书
            e0.setAttribute("info", "2016/7/20");
            Element e1=doc.createElement("book");
            e1.setAttribute("id", "1");
            e1.setAttribute("info", "文学类");
            Element e11=doc.createElement("name");
            Text nameValue=doc.createTextNode("蛙");
            Element e12=doc.createElement("author");
            Text authorValue=doc.createTextNode("莫言");
            //树顺序将文本添加到XML中去
            doc.appendChild(e0);
            e0.appendChild(e1);
            e1.appendChild(e11);
            e11.appendChild(nameValue);
            e1.appendChild(e12);
            e12.appendChild(authorValue);
            
            Transformer t=TransformerFactory.newInstance().newTransformer();
            //设置换行和首行缩进
            t.setOutputProperty(OutputKeys.INDENT,"yes");
            t.setOutputProperty(OutputKeys.METHOD, "xml");
            //输出
            t.transform(new DOMSource(doc), new StreamResult(new FileOutputStream(new File("book01.xml"))));    
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }catch (TransformerConfigurationException | TransformerFactoryConfigurationError e) {
            e.printStackTrace();
        }catch (FileNotFoundException | TransformerException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        
        DOMTest dm=new DOMTest();
        dm.readXML();
        dm.writerXML();
    }
}

下面是我的XML

<?XML version = "1.0" encoding="UTF-8"?>
<bookstore info="2016/7/20">
<book id="1" lib="益智类">
    <name>十万个为什么</name>
    <author>失名</author>
    <year>1995</year>
    <publisher>北京文化出版社</publisher>
</book>
<book id="2" lib="益智类">
    <name>十万个不为什么</name>
    <author>不失名</author>
    <year>1995</year>
    <publisher>北京文化娱乐出版社</publisher>
</book>
<book id="3" lib="科学类">
    <name>上帝在掷骰子吗?</name>
    <author>一个中国人</author>
    <year>1999</year>
    <publisher>北京科学出版社</publisher>
</book>
</bookstore>

对于读取结果

对于写入结果

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<bookstore info="2016/7/20">
<book id="1" info="文学类">
<name></name>
<author>莫言</author>
</book>
</bookstore>

目前存在的疑问是:1.调整输出,或者如何将输出写入数据库,或者集合接收。

         2.写进XML文件应该还可以封装为一个方法,简单调用什么的

如果我的文章给您带来不便,还请见谅,如果我的文章给您带来帮助,我很荣幸,如果大牛有高见(应该不会有大牛过来看这个。。),乐意接受!

 2016/7/20  TheTinkerJ

 

posted @ 2016-07-20 15:48  TheTinkerJ  阅读(127)  评论(0)    收藏  举报