使用DOM解析XML

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/StromMaybin/article/details/52740275
/**
*@ author StormMaybin
*@ date 2016-10-05
*/

生命不息,奋斗不止!



DOM解析XML原理

DOM模式解析XML,是把整个XML文档当成一个对象来处理,会先把整个文档读入到内存里。是基于树的结构,通常需要加载整文档和构造DOM树,然后才能开始工作。

优缺点及适用情况

优点是可以对进行修改操作。
缺点是占用高,解析成本大。



递归遍历XML文档标签

XML文档 student.xml

    <?xml version="1.0" encoding="UTF-8"?>
<students>
    <student>
        <name>StormMa</name>
        <age>20</age>
        <height>176</height>
    </student>
    <student>
        <name>Jack</name>
        <age>21</age>
        <height>178</height>
        <job>coder</job>
    </student>
</students>

遍历XML文档标签

package com.stormma.parse;

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ParseXMLDemo1
{
    public static void main(String[] args) throws Exception
    {
        // TODO Auto-generated method stub
        getElement();
    }
    /**
     * 遍历文档元素
     * @throws Exception
     */
    public static void getElement () throws Exception
    {
        //获得工厂实例
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //获得解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        //解析文档
        Document document = builder.parse("src/student.xml");


        //得到根节点
        Element root = (Element) document.getElementsByTagName("students").item(0);
        list (root);
    }
    /**
     * 递归函数
     * @param node
     */
    private static void list(Node node)
    {
        //剔除空白符
        if (node instanceof Element)
        {
            System.out.println(node.getNodeName());
        }
        NodeList list = node.getChildNodes();

        for (int i = 0; i < list.getLength(); i++)
        {
            Node child = list.item(i);
            list(child);
        }
    }
}

遍历结果
这里写图片描述

向XML文档添加标签



StormMa添加job标签

public class ParseXMLDemo2
{

    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception
    {
        // TODO Auto-generated method stub
        add();
    }

    public static void add() throws Exception
    {
        // 获得工厂实例
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 获得解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 解析文档
        Document document = builder.parse("src/student.xml");

        //创建要插入的标签
        Element job = document.createElement("job");
        job.setTextContent("student");

        //得到要插入标签的父标签
        Element student = (Element) document.getElementsByTagName("student").item(0);
        student.appendChild(job);

        //刷新更新的文档
        //得到转换器
        Transformer tf = TransformerFactory.newInstance().newTransformer();
        tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/student.xml")));
    }
}

插入結果
这里写图片描述

指定位置插入标签

在StormMa身高的前面添加job标签

> 需求:StormMa添加id属性值为1
public static void add2() throws Exception
    {
        // 获得工厂实例
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 获得解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 解析文档
        Document document = builder.parse("src/student.xml");

        // 创建要插入的标签
        Element job = document.createElement("job");
        job.setTextContent("student");

        // 得到参考位置的标签(参考)
        Element refNode = (Element) document.getElementsByTagName("height").item(0);

        // 得到要插入标签的父标签
        Element student = (Element) document.getElementsByTagName("student")
                .item(0);

        // 插入标签
        student.insertBefore(job, refNode);

        // 刷新更新的文档
        // 得到转换器
        Transformer tf = TransformerFactory.newInstance().newTransformer();
        tf.transform(new DOMSource(document), new StreamResult(
                new FileOutputStream("src/student.xml")));
    }

插入结果
这里写图片描述

添加属性

需求:StormMa添加id属性值为1


/**
     * 添加属性
     * 
     * @throws Exception
     */
    public static void addAttr() throws Exception
    {
        // 获得工厂实例
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 获得解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 解析文档
        Document document = builder.parse("src/student.xml");

        // 得到要插入属性的结点
        Element student = (Element) document.getElementsByTagName("student")
                .item(0);
        student.setAttribute("id", "1");

        // 刷新更新的文档
        // 得到转换器
        Transformer tf = TransformerFactory.newInstance().newTransformer();
        tf.transform(new DOMSource(document), new StreamResult(
                new FileOutputStream("src/student.xml")));
    }

这里写图片描述

删除标签

需求:删除StormMa的job.

/**
     * 删除结点(标签)
     * @throws Exception
     */
    public static void delete() throws Exception
    {
        // 获得工厂实例
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 获得解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 解析文档
        Document document = builder.parse("src/student.xml");

        //得到要删除的结点
        Element e = (Element) document.getElementsByTagName("job").item(0);
        //得到要删除结点的父节点
        //Element fa1 = (Element) e.getParentNode();和下句效果一样。
        Element fa = (Element) document.getElementsByTagName("student").item(0);
        //父结点删除孩子结点
        fa.removeChild(e);

        // 刷新更新的文档
        // 得到转换器
        Transformer tf = TransformerFactory.newInstance().newTransformer();
        tf.transform(new DOMSource(document), new StreamResult(
                new FileOutputStream("src/student.xml")));
    }

删除结果
这里写图片描述
ps:要删除某个结点,得到父亲结点,然后删除。删除整个文档同理。

删除属性

fa.removeAttribute(name);

更新标签内容

需求:更新StormMa的身高为180.


/**
     * 更新标签内容
     * 
     * @throws Exception
     */
    public static void update() throws Exception
    {
        // 获得工厂实例
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 获得解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 解析文档
        Document document = builder.parse("src/student.xml");

        // 得到要更新的标签
        Element height = (Element) document.getElementsByTagName("height").item(0);
        height.setTextContent("180");

        // 刷新文档内容
        // 得到转换器
        Transformer tf = TransformerFactory.newInstance().newTransformer();
        tf.transform(new DOMSource(document), new StreamResult(
                new FileOutputStream("src/student.xml")));
    }

没有更多推荐了,返回首页