原生XML的介绍与Java代码实现增删改查

1、关于xml

1.1 xml简介

        xml是一种可拓展的标记语言,类似html。是W3C组织发布的,目前遵守的是2000年发布的XML1.0规范。被广泛认为是继Java之后在Internet上最激动人心的新技术。

1.2 xml的优缺点

        优点:树状结构简单清晰,无论是人还是计算机都能轻松解析。

        缺点:若XML文件过大,可能造成内存溢出。

1.3 xml的用途

      传输数据,而非显示数据。

1.4 xml的语法

    (1)内容编码和文件本身编码要一致

    (2)一个XML文档必须有且仅有一个根标签,不允许标签嵌套

    (3)区分大小写

备注:导包记得导org.w3c组织的

2、xml的用法

2.1 DOM:Document Object Model(文档对象模型)

    使用面向对象的方式,把xml文件中的结构使用对象来表示。使用Java操作XML类似与使用JavaScript操作HTML。

    特点:在加载的时候,一次性把整个XML文档加载进内存,在内存中形成一颗树(Document对象),我们使用代码操作Document,其次操作的是内存中的DOM树,和本地磁盘中的XML文件没有直接关系,除非做同步操作(把内存中的数据更新到XML文件),增删改操作后都需要做同步操作。

2.2 在xml中,一切皆节点(Node)

     Document        文档节点(XML文件)

     Element            元素节点(使用<>表示标签)

     Attr                   属性节点(元素上属性名=“属性值”)

     Text                  文本节点(元素之间的内容)

2.3 操作步骤

    (1)必先得知被操作的XML文件路径:

      File file = new File("C:/Users/WZX/IdeaProjects/jdbc/src/main/resources/xml/contacts.xml");

    (2)创建DocumentBuilderFactory对象(工厂类一般都有一个静态方法用于返回当前工厂类对象)

         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    (3)根据工厂对象,创建DocumentBulider对象

        DocumentBuilder builder = factory.newDocumentBuilder();

    (4) 根据Builder对象去解析一个已经存在的xml文件,从而获得Document对象

        Document document = builder.parse(file);

2.4 常用方法

    (1)Node中的方法

       String  getTextContext():获取当前元素的文本内容

       void  setTextContext(String textContext):给当前元素设置新的文本内容

       Node  appendChild(Node newChild) :给当前元素设置一个子元素

       Node  removeChild(Node oldChild):删除当前元素中指定的一个子元素

     (2)Document中的方法

       Element getDocumentElement():获取文档的根元素

       Element getElementsByTagName(String tagName):根据元素的名称获取多个元素集合对象,从整个文档中寻找

       Element createElement(String tagName):根据元素名称,创建元素对象

     (3)Element中的方法

       NodeList getElementsByTagName(String tagName):根据元素的名称获取多个元素集合对象,从当前元素的子元素中去寻找

       String getAttribute(String name):获取当前元素的指定属性的值

       void setAttribute(string name,String value):给当前元素设置指定的属性名称和值

3、xml文件(contacts.xml)

<?xml version="1.0" encoding="UTF-8"?>
<contacts>
    <linkman>
        <age>20</age>
        <name>zavier</name>
        <email>31@qq.com</email>
    </linkman>
    <linkman>
        <age>20</age>
        <name>china</name>
        <email>31@qq.com</email>
    </linkman>
</contacts>

4、测试代码

package springboot;

import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.FileWriter;
import java.util.List;

public class XMLTests {
    /*
       获取Document文本对象
    */
    // 要操作文本对象,首先就要获取文本对象的路径
    File file = new File("C:/Users/WZX/IdeaProjects/jdbc/src/main/resources/xml/contacts.xml");
    // 创建DocumentBuilderFactory对象(工厂类一般都有一个静态方法用于返回当前工厂类对象)
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder;
    Document document;
    Element root;
    {
        try {
            // 根据工厂对象,创建DocumentBulider对象
            builder = factory.newDocumentBuilder();
            // 根据Builder对象去解析一个已经存在的xml文件,从而获得Document对象
            document = builder.parse(file);
            // 获取XMl文档的根元素
            root = document.getDocumentElement();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 获取第二个联系人的姓名
     *
     * @throws Exception
     */
    @Test
    public void testGet() throws Exception {
        // 获取根元素中第二个联系人,item表示第几个元素,索引从0开始
        Element linkman = (Element) root.getElementsByTagName("linkman").item(1);
        // 获取第二个联系人的姓名
        Element name = (Element) linkman.getElementsByTagName("name").item(0);
        System.out.println(name.getTextContent());
    }

    /**
     * 修改第二个联系人的姓名
     */
    @Test
    public void testUpdate() throws Exception {
        // 获取根元素中第二个联系人
        Element element = (Element) root.getElementsByTagName("linkman").item(1);
        // 获取第二个联系人的姓名
        Element name = (Element) element.getElementsByTagName("name").item(0);
        // 修改第二个联系人的姓名
        name.setTextContent("china");
        System.out.println(name.getTextContent());
        // 此时只是内存中修改了,contacts.xml中并没有改变,需要把内存中的数据同步到磁盘中
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        // 源:内存中的Document对象
        Source source = new DOMSource(document);
        // 目标:磁盘中的XML文件(contacts.xml)
        StreamResult result = new StreamResult(file);
        transformer.transform(source,result);
    }

    /**
     * 向指定元素中新增子节点
     * 新增联系人
     */

    @Test
    public void testAdd() throws Exception {
        //创建元素节点以及子节点
        Element linkman = document.createElement("linkman");
        Element age = document.createElement("age");
        Element name = document.createElement("name");
        Element email = document.createElement("email");
        // 给linkman设置属性
        linkman.setAttribute("id","4");
        // 给创建的元素子节点赋值
        age.setTextContent("20");
        name.setTextContent("呵呵");
        email.setTextContent("za@");
        // 把子节点加到linkman节点中
        linkman.appendChild(name);
        linkman.appendChild(age);
        linkman.appendChild(email);
        // 把linkman节点加到contacts节点中(根元素)
        root.appendChild(linkman);
        // 同步:把内存中的内容同步到磁盘中
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(new DOMSource(document),new StreamResult(file));
    }

    /**
     * 设置/获取元素的属性
     */
    @Test
    public void testEleAttr() throws Exception {
        Element linkman = (Element) root.getElementsByTagName("linkman").item(3);
        //设置元素属性
//        linkman.setAttribute("id","04");
        // 获取元素属性
        String id = linkman.getAttribute("id");
        System.out.println(id);
        // 同步:把内存中的内容同步到磁盘中
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(new DOMSource(document),new StreamResult(file));
    }

    /**
     * 删除指定元素节点
     */
    @Test
    public void testDelete() throws Exception{
        Element linkman = (Element) root.getElementsByTagName("linkman").item(2);
        // 调用父类中的方法删除改元素
        linkman.getParentNode().removeChild(linkman);
        // 同步:把内存中的内容同步到磁盘中
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(new DOMSource(document),new StreamResult(file));
    }

    /**
     * 在内存中创建一个Document对象
     */
    @Test
    public void testAddDoc() throws Exception{
        // 要操作文本对象,首页就要获取文本对象的路径
        File newFile = new File("C:/Users/WZX/IdeaProjects/jdbc/src/main/resources/xml/addDocument.xml");
        Document doc = null;
        DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        // 判断文件是否存在,不存在则创建,存在则解析
        if (newFile.exists()){
            doc  = docBuilder.parse(newFile);
        }else {
            doc = docBuilder.newDocument();
            //创建根元素
            Element contacts = doc.createElement("contacts");
            // 创建元素节点
            Element linkman = doc.createElement("linkman");
            Element name = doc.createElement("name");
            name.setTextContent("王五");
            linkman.appendChild(name);
            contacts.appendChild(linkman);
            doc.appendChild(contacts);
        }
        // 同步
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(new DOMSource(doc),new StreamResult(newFile));
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值