java对XML文档的操作之dom(使用jaxp,sun公司的自带包)

测试的XML文档:(注意,该文档是放在src文件夹下的,不是和java文件放在同一个包,不然读取xml时会出错)

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<商店>
    <商品>
        <名称 name="hhhhh">A商品</名称>
        <价格>890元</价格>
        <数量>1</数量>
    </商品>
    <商品>
        <名称>B商品</名称>
        <价格>50</价格>
        <数量>5</数量>
    </商品>

</商店>

java代码(包括对XML文档的增删改查)

package com.cx.day0802;

import java.io.FileOutputStream;

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.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Demo1 {

    @Test
    public void read() throws Exception{
        //读取dom文档,读取某个节点的内容
        //1、获取 DocumentBuilderFactory 的新实例。
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        //2、创建一个新的 DocumentBuilder 实例。 
        DocumentBuilder builder = factory.newDocumentBuilder();

        //3、获得dom对象
        Document dom = builder.parse("src/test.xml");

        //获取指定标签
        NodeList list = dom.getElementsByTagName("价格");

        //获取第几个的标签从0开始
        Node node = list.item(0);

        //输出标签体
        System.out.println(node.getTextContent());
    }

    @Test
    public void read1() throws Exception{
        //读取dom文档,读取某个节点的属性
        //1、获取 DocumentBuilderFactory 的新实例。
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        //2、创建一个新的 DocumentBuilder 实例。 
        DocumentBuilder builder = factory.newDocumentBuilder();

        //3、获得dom对象
        Document dom = builder.parse("src/test.xml");

        //获取指定标签的属性,,这里强制转换为Element类型,直接操作根据属性名取值
        Element e = (Element) dom.getElementsByTagName("名称").item(0);
        System.out.println(e.getAttribute("name"));
    }

    @Test
    public void read2() throws Exception{
        //读取dom文档,读取所有节点标签
        //1、获取 DocumentBuilderFactory 的新实例。
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        //2、创建一个新的 DocumentBuilder 实例。 
        DocumentBuilder builder = factory.newDocumentBuilder();

        //3、获得dom对象
        Document dom = builder.parse("src/test.xml");


        //获取根节点
        Node root = dom.getElementsByTagName("商店").item(0);

        //递归实现
        list(root);
    }

    private void list(Node node) {

        //如果是节点元素就输出
        if(node instanceof Element){
            System.out.println(node.getNodeName());
        }
        //获取节点的子节点
        NodeList clist = node.getChildNodes();

        //循环输出子节点标签
        for(int i=0; i<clist.getLength();i++){
            //递归
            list(clist.item(i));
        }

    }

    @Test
    public void add() throws Exception{
        //读取dom文档,增加节点标签
        //1、获取 DocumentBuilderFactory 的新实例。
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        //2、创建一个新的 DocumentBuilder 实例。 
        DocumentBuilder builder = factory.newDocumentBuilder();

        //3、获得dom对象
        Document dom = builder.parse("src/test.xml");

        //读取要增加节点标签的父节点,强制转换为Element
        Element e = (Element) dom.getElementsByTagName("商品").item(0);

        //建立新节点
        Element newE = dom.createElement("新标签");
        newE.setTextContent("400元");

        //向父节点增加新节点标签
        e.appendChild(newE);

        //从内存中保存到xml文档中

        //实例化TransformerFactory工厂类,将源树转换为结果树。
        TransformerFactory tffactor = TransformerFactory.newInstance();
        //创建执行从 Source 到 Result 的复制的新 Transformer。
        Transformer tf = tffactor.newTransformer();
        //将 XML Source 转换为 Result。
        tf.transform(new DOMSource(dom), new StreamResult(new FileOutputStream("src/test.xml")));


    }

    @Test
    public void add1() throws Exception{
        //读取dom文档,向指定位置增加节点标签
        //1、获取 DocumentBuilderFactory 的新实例。
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        //2、创建一个新的 DocumentBuilder 实例。 
        DocumentBuilder builder = factory.newDocumentBuilder();

        //3、获得dom对象
        Document dom = builder.parse("src/test.xml");

        //读取要增加节点标签的父节点,强制转换为Element
        Element e = (Element) dom.getElementsByTagName("商品").item(0);

        //建立新节点
        Element newE = dom.createElement("新标签");
        newE.setTextContent("400元");

        //获得指定位置之后的节点
        Element ref = (Element) dom.getElementsByTagName("价格").item(0);


        //向父节点增加新节点标签
        e.insertBefore(newE, ref);

        //从内存中保存到xml文档中

        //实例化TransformerFactory工厂类,将源树转换为结果树。
        TransformerFactory tffactor = TransformerFactory.newInstance();
        //创建执行从 Source 到 Result 的复制的新 Transformer。
        Transformer tf = tffactor.newTransformer();
        //将 XML Source 转换为 Result。
        tf.transform(new DOMSource(dom), new StreamResult(new FileOutputStream("src/test.xml")));


    }

    @Test
    public void delete() throws Exception{

        //读取dom文档,删除指定位置节点标签
        //1、获取 DocumentBuilderFactory 的新实例。
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        //2、创建一个新的 DocumentBuilder 实例。 
        DocumentBuilder builder = factory.newDocumentBuilder();

        //3、获得dom对象
        Document dom = builder.parse("src/test.xml");

        Element e = (Element) dom.getElementsByTagName("新标签").item(0);

        //获得该节点的父节点,其父节点删除该节点
        e.getParentNode().removeChild(e);

//从内存中保存到xml文档中

        //实例化TransformerFactory工厂类,将源树转换为结果树。
        TransformerFactory tffactor = TransformerFactory.newInstance();
        //创建执行从 Source 到 Result 的复制的新 Transformer。
        Transformer tf = tffactor.newTransformer();
        //将 XML Source 转换为 Result。
        tf.transform(new DOMSource(dom), new StreamResult(new FileOutputStream("src/test.xml")));

    }

    @Test
    public void update() throws Exception{

        //读取dom文档,删除指定位置节点标签
        //1、获取 DocumentBuilderFactory 的新实例。
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        //2、创建一个新的 DocumentBuilder 实例。 
        DocumentBuilder builder = factory.newDocumentBuilder();

        //3、获得dom对象
        Document dom = builder.parse("src/test.xml");

        Element e = (Element) dom.getElementsByTagName("价格").item(0);

        //获得该节点的父节点,其父节点删除该节点
        e.setTextContent("890元");

//从内存中保存到xml文档中

        //实例化TransformerFactory工厂类,将源树转换为结果树。
        TransformerFactory tffactor = TransformerFactory.newInstance();
        //创建执行从 Source 到 Result 的复制的新 Transformer。
        Transformer tf = tffactor.newTransformer();
        //将 XML Source 转换为 Result。
        tf.transform(new DOMSource(dom), new StreamResult(new FileOutputStream("src/test.xml")));

    }
}

猜你喜欢

转载自blog.csdn.net/u010309756/article/details/76576532