欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-28 14:59:40
...

测试的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")));

    }
}
相关标签: java xml