XML(九)-使用DOM来生成xml文档

使用DOM来生成xml文档

对于生成xml文档来说需要以下几个类的支持

 

下面这端代码就是生成图中的xml文档的

package cn.org.kingdom.dom;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
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.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class DomCreateDemo {
    public static void main(String[] args) throws Exception {
        // 建立DocumentBuilderFactory对象
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = null;
        Document doc = null;
        db = dbf.newDocumentBuilder();
        doc = db.newDocument();
        // 建立节点
        Element student = doc.createElement("student");
        // 创建属性节点
        Node sex = (Node) doc.createAttribute("sex");
        // 设置属性节点的值
        sex.setNodeValue("男");
        // 设置属性节点到student节点上
        student.setAttributeNode((Attr) sex);
        // 建立id节点
        Element id = doc.createElement("id");
        // 建立名字节点
        Element name = doc.createElement("name");
        // 建立年龄节点
        Element age = doc.createElement("age");
        // 为id节点添加内容
        id.appendChild(doc.createTextNode("id01"));
        // 为name节点添加内容
        name.appendChild(doc.createTextNode("张三"));
        // 为年龄节点添加内容
        age.appendChild(doc.createTextNode("15"));
        // 将三个子节点加入到父节点中
        student.appendChild(id);
        student.appendChild(name);
        student.appendChild(age);
        // 将根元素加入到根节点上
        doc.appendChild(student);
        // 输出文档到文件
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = null;
        t = tf.newTransformer();
        // 设置编码
        // 创建源t.setOutputProperty(OutputKeys.ENCODING)
        DOMSource ds = new DOMSource(doc);
        // 创建目标
        StreamResult result = new StreamResult(new File("src/output.xml"));
        // 输出
        t.transform(ds, result);
    }
}

下面再来看一个例子,如何使用DOM来解析任意的XML文档(这里不考虑一些复杂的xml)

xml文档的原型如下

<?xml version="1.0"  encoding="UTF-8" standalone="yes"?>
<persons>
    <!-- this is comment -->
    <person id = "p01">
        <name>张三</name>
        <age>15</age>
        <address>南京市</address>
    </person>
    <person id = "p02">
        <name>李小龙</name>
        <age>20</age>
        <address>美国</address>
    </person>
</persons>

下面是java代码

package cn.org.kingdom.dom;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Attr;
import org.w3c.dom.Comment;
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.xml.sax.SAXException;
/**
 * 解析整个XML文档
 * 递归操作
 */
public class TestDemo03 {
    public static void main(String[] args) {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new File("src/test2.xml"));
            Element root = doc.getDocumentElement();
            parseElement(root);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private static void parseElement(Element el) {
        String tagName =el.getTagName();
        NodeList list = el.getChildNodes();
        System.out.print("<"+tagName);
        //判断是否有属性
        NamedNodeMap mnm  = el.getAttributes();
        if(mnm!=null) {
            for (int i = 0; i < mnm.getLength(); i++) {
                Attr attr = (Attr) mnm.item(i);
                String attr_name = attr.getName();
                String attr_value = attr.getValue();
                System.out.print(" "+attr_name+"=\""+attr_value+"\"");
            }
        }
        System.out.print(">");
        for (int i = 0; i < list.getLength(); i++) {
            Node node = list.item(i);
            if(node.getNodeType()==node.ELEMENT_NODE) {
                parseElement((Element) node);
            }else if(node.getNodeType()==node.TEXT_NODE) {
                System.out.print(node.getNodeValue());
            }else if(node.getNodeType()==node.COMMENT_NODE){
                System.out.println("<!--"+((Comment)node).getData()+"-->");
            }
        }
        System.out.println("</"+tagName+">");
    }
}

更多内容,请参考Java api

posted @ 2016-05-19 14:43  Mirindasky  阅读(259)  评论(0编辑  收藏  举报