美文网首页
Java 编程之 XML DOM

Java 编程之 XML DOM

作者: 菩提树下成魔 | 来源:发表于2017-10-15 23:08 被阅读13次

    0x01 前言

      文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口。在网页上,组织页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象的标准模型就称为 DOM。

    0x02 Java 操作 XML DOM

      在 Java 中,XML DOM 解析器一次性把整个 XML 文档加载进内存,然后在内存中构建一颗 Document的对象树,通过 Document 对象,得到树上的节点对象,通过节点对象访问(操作)到 XML 文档的内容。在代码执行过程中,操作的 Document 对象其实是加载在运行内存中的 DOM 树,和本地磁盘存储 XML 文档没有任何关系,操作完了之后需要进行更新操作。

    0x03 具体实现

      获取 XML DOM 对象。

    //1、获取 XML 文件对象
    File file = new File("src/Java_DOM/User.xml");
    //2、利用工厂类创建 DocumentBuilderFactory 对象
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    //3、根据工厂对象,创建 DocumentBuilder 对象
    DocumentBuilder builder = factory.newDocumentBuilder();
    //4、根据 builder 对象去解析一个已经存在的 XML 文件,从而得到 Document 对象
    Document document = builder.parse(file);
    

      创建需要操作的 XML 文档 User.xml

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <account>
        <user id="0001">
            <username>root</username>
            <password>toor</password>
            <userId>0001</userId>
            <power>0</power>
        </user>
        <user id="0002">
            <username>张三</username>
            <password>zhangsan</password>
            <userId>0002</userId>
            <power>1</power>
        </user>
        <user id="0003">
            <username>李四</username>
            <password>lisi</password>
            <userId>0003</userId>
            <power>1</power>
        </user>
    </account>
    

      查询指定节点内容。

    private File file = new File("src/Java_DOM/User.xml");
    @Test
    public void testQuery() {
        Document document = null;
        try {
            // 1、创建Document对象:
            // 1.1、创建DocumentBuilderFactory对象factory
            // 1.2、根据factory对象,创建DocumentBuilder对象builder
            // 1.3、根据builder对象,创建document对象
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            document = builder.parse(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
        Element account = document.getDocumentElement(); // 获取根元素 account
        Element user = (Element) account.getElementsByTagName("user").item(1); // 获取 account 中的第二个 user 子元素
        Element password = (Element) user.getElementsByTagName("password").item(0); // 获取 user 中子元素 password
        System.out.println(password.getTextContent()); // 获取元素 password 中的内容
    }
    

      修改指定节点内容。

    @Test
    public void testUpdate() {
        try {
            Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file); // 获文档对象 doucument
            Element account = document.getDocumentElement(); // 获取根元素 account
            Element user = (Element) account.getElementsByTagName("user").item(2); // 获取 account 中的第三个 user 子元素
            Element username = (Element) user.getElementsByTagName("username").item(0); // 获取 user 中的子元素 username
            username.setTextContent("王五"); // 修改元素 username 中的值
            Transformer trans = TransformerFactory.newInstance().newTransformer(); // 同步操作,更新目标文件
            Source xmlSource = new DOMSource(document);
            Result outputTarget = new StreamResult(file);
            trans.transform(xmlSource, outputTarget);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

      增加新的节点内容。

    @Test
    public void testInsert() {
        try {
            Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
            Element account = document.getDocumentElement(); // 获取根元素 account
            Element user = document.createElement("user"); // 创建元素节点 user
            Element username = document.createElement("username"); // 创建元素节点 username
            Element password = document.createElement("password"); // 依此类推
            Element userId = document.createElement("userId");
            Element power = document.createElement("power");
            username.setTextContent("王五"); // 给元素节点赋值
            password.setTextContent("wangwu");
            userId.setTextContent("0004");
            power.setTextContent("2");
            user.appendChild(username); // 将 username 节点添加为 user 的子节点
            user.appendChild(password); // 以此类推
            user.appendChild(userId);
            user.appendChild(power);
            account.appendChild(user);
            Transformer trans = TransformerFactory.newInstance().newTransformer(); // 同步操作,更新目标文件
            Source xmlSource = new DOMSource(document);
            Result outputTarget = new StreamResult(file);
            trans.transform(xmlSource, outputTarget);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

      删除指定节点内容。

    @Test
    public void testDelete() {
        try {
            Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file); // 获取 document 对象
            Element account = document.getDocumentElement(); // 获取根元素 account
            Element user = (Element) account.getElementsByTagName("user").item(2); // 获取第二个 user 元素
            user.getParentNode().removeChild(user); // 请父元素删除子元素
            Transformer transformer = TransformerFactory.newInstance().newTransformer(); //  同步操作,更新目标文件
            Source xmlSource = new DOMSource(document);
            Result outputTarget = new StreamResult(file);
            transformer.transform(xmlSource, outputTarget);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

      操作指定节点的属性。

    @Test
    public void testUpdateAttribute() {
        try {
            Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
            Element account = document.getDocumentElement();
            Element user = (Element) account.getElementsByTagName("user").item(2);
            String id = user.getAttribute("id"); // 获取 user 中的属性 id 的值
            // TODO id
            user.setAttribute("id", "0004"); // 设置 user 中的属性 id 的值
            user.removeAttribute("id"); // 删除 user 中的属性 id 的值
            Transformer transformer = TransformerFactory.newInstance().newTransformer(); //  同步操作,更新目标文件
            Source xmlSource = new DOMSource(document);
            Result outputTarget = new StreamResult(file);
            transformer.transform(xmlSource, outputTarget);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

      在内存中创建一个Document对象,并同步到磁盘。

    @Test
    public void testDOMSix() throws Exception {
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document document = null;
        if (file.exists()) {
            document = builder.parse(file);
            System.out.println("文件已经存在");
        } else {
            document = builder.newDocument();
            document.appendChild(document.createElement("account"));
            System.out.println("文件没有存在");
        }
        // TODO 其他操作
        Transformer trans = TransformerFactory.newInstance().newTransformer(); // 同步操作,更新目标文件
        Source xmlSource = new DOMSource(document);
        Result outputTarget = new StreamResult(file);
        trans.transform(xmlSource, outputTarget);
    }
    

    相关文章

      网友评论

          本文标题:Java 编程之 XML DOM

          本文链接:https://www.haomeiwen.com/subject/chehuxtx.html