DOM解析

JAXP 解析XML DOM解析 SAX解析
java.xml.parsers 存放 DOM和SAX解析器
java.xml.stream 存放 STAX解析相关类
org.w3c.dom 存放DOM解析时 数据节点类
org.xml.sax 存放SAX解析的相关工具类

1.DOM 解析 树形结构
元素、属性、文本都被解析成节点,属性节点不属于任何节点的子节点和父节点
(1)创建XML文档
在企业实际开发中,为了简化xml 生成和解析 —- xml 数据文件通常不使用约束的
(2)使用DOM解析xml
将整个xml文档加载到内存中 : 工厂 — 解析器 — 解析加载
(3)、Document通过 getElementsByTagName 获得 节点集合 NodeList
通过 NodeList 提供 getLength 和 item 遍历 节点集合
遍历ArrayList
for (int i=0;i

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books [
    <!ELEMENT books (book+) >
    <!ELEMENT book (name,price) >
    <!ELEMENT name (#PCDATA) >
    <!ELEMENT price (#PCDATA) >
    <!ATTLIST book
       id ID #REQUIRED 
    >
]>
<books>
    <book id="a1">
        <name>java基础</name>
        <price>80</price>
    </book>
    <book id="a2">
        <name>java 编程思想</name>
        <price>1000</price>
    </book>
    <book id="a3">
        <name>编程思想</name>
        <price>1000</price>
    </book>
</books>
package com.qddx;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
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 DOMTest {

    @Test
    // 将 books.xml 加载内存中,将文档内容 写入另一个xml books_bak.xml 回写
    public void demo5() throws Exception {
        // 将 文档 载入内存
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory
                .newInstance();
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        Document document = builder.parse("books.xml");

        // 回写xml 用到 Transformer
        TransformerFactory transformerFactory = TransformerFactory
                .newInstance();
        Transformer transformer = transformerFactory.newTransformer();

        DOMSource domSource = new DOMSource(document);// 用document构造数据源
        StreamResult result = new StreamResult(new File("books_bak.xml"));

        transformer.transform(domSource, result);
    }

    @Test
    // getElementById 用法 --- 查找 id a1 图书 名称
    public void demo4() throws Exception {
        // 装载xml 加载内存 --- Document对象
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory
                .newInstance();
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        Document document = builder.parse("books.xml");

        // 直接通过id 查找 ----- 文档必须使用 约束 --- 不用约束xml文档 不能 使用getElementById
        Element book = document.getElementById("a1");
        System.out.println(book);
        System.out.println(book.getChildNodes().item(1).getTextContent());
    }

    @Test
    public void demo3() throws Exception {
        DocumentBuilderFactory bf = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = bf.newDocumentBuilder();
        Document document = builder.parse("books.xml");
        // 利用好全局查询锁定每个name节点
        NodeList nodelist = document.getElementsByTagName("book");
        for (int i = 0; i < nodelist.getLength(); i++) {
            Element name = (Element) nodelist.item(1);
            if (name.getTextContent().equals("java基础")) {
                // priceshi name 节点兄弟的兄弟
                Element price = (Element) name.getNextSibling()
                        .getNextSibling();
                System.out.println(price.getTextContent());
            }
        }
    }

    @Test
    // 查询Java 基础 售价
    public void demo2() throws Exception {

        DocumentBuilderFactory bf = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = bf.newDocumentBuilder();
        Document document = builder.parse("books.xml");

        // 全局查找 作为程序的切入

        NodeList nodelist = document.getElementsByTagName("book");
        for (int i = 0; i < nodelist.getLength(); i++) {
            Element book = (Element) nodelist.item(i);
            // 找book节点当中 name节点的值 java 基础
            NodeList chidren = book.getChildNodes();
            // System.out.println(chidren.getLength());
            Element name = (Element) chidren.item(1);// book的第二个子节点解释name
            if (name.getTextContent().equals("java基础")) {
                // 当前for循环这本书是目标图书
                // 打印图书价格price 是book的第四个子节点
                Element price = (Element) chidren.item(3);
                System.out.println(price.getTextContent());
            }

        }
    }

    @Test
    public void demo1() throws Exception {
        // 通过DOM解析XML --载入整个XML工厂--解析器--加载

        // 构造工厂
        DocumentBuilderFactory bf = DocumentBuilderFactory.newInstance();
        // 使用工厂获得解析器
        DocumentBuilder builder = bf.newDocumentBuilder();
        // 使用解析器加载XML文档
        Document document = builder.parse("books.xml");

        // Document 代表整个XML文档,通过Document 操作XML数据

        // 将所图书的名称打印出来
        // nodelist 代表节点的集合
        NodeList nodelist = document.getElementsByTagName("name");
        // 遍历集合中所有的node
        System.out.println("图书name节点数量:" + nodelist.getLength());
        for (int i = 0; i < nodelist.getLength(); i++) {
            Node node = nodelist.item(i);// 这里每个node都是<name></name>---元素
            Element e = (Element) node;// 将节点转换为子类型节点
            System.out.println(e.getNodeName());
            System.out.println(e.getNodeType());
            System.out.println(e.getNodeValue());
            // 输出name元素节点的子节点
            // System.out.println(e.getFirstChild().getNodeValue());
            System.out.println(e.getTextContent());
            System.out.println("  ");

        }

    }
}
package com.qddx;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
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.NodeList;

public class DOMCURT {

    @Test
    // 删除包含java图书名称的图书
    public void testDelete() throws Exception {
        // 加载xml到内存
        DocumentBuilderFactory bf = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = bf.newDocumentBuilder();
        Document document = builder.parse("books.xml");

        NodeList nodelist = document.getElementsByTagName("name");
        for (int i = 0; i < nodelist.getLength(); i++) {
            Element name = (Element) nodelist.item(i);
            if (name.getTextContent().contains("java")) {
                // 删除这本书 通过name 获得图书
                Element book = (Element) name.getParentNode();
                // 删除必须通过父节点
                book.getParentNode().removeChild(book);
                i--;
            }
        }
        // 回写
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        DOMSource domSource = new DOMSource(document);// 用DOM构造数据源
        StreamResult result = new StreamResult(new File("books_bak.xml"));
        transformer.transform(domSource, result);
    }

    @Test
    // 强Java基础的价格上调20%
    public void testUpdate() throws Exception {
        // 加载xml到内存
        DocumentBuilderFactory bf = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = bf.newDocumentBuilder();
        Document document = builder.parse("books.xml");

        // 查找Java基础
        NodeList nodelist = document.getElementsByTagName("name");

        for (int i = 0; i < nodelist.getLength(); i++) {
            Element name = (Element) nodelist.item(i);
            if (name.getTextContent().equals("java基础")) {
                // 找到改价格
                Element price = (Element) name.getNextSibling()
                        .getNextSibling();
                double money = Double.parseDouble(price.getTextContent());
                money = money * 1.2;

                price.setTextContent(money + "");
            }
        }

        // 回写
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        DOMSource domSource = new DOMSource(document);// 用DOM构造数据源
        StreamResult result = new StreamResult(new File("books_bak.xml"));
        transformer.transform(domSource, result);
    }

    @Test
    // 向XML中添加一个book元素
    public void testAdd() throws Exception {

        // 将原来的book.xml加载到内容
        DocumentBuilderFactory bf = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = bf.newDocumentBuilder();
        Document document = builder.parse("books.xml");

        // 添加节点 创建节点
        Element newbook = document.createElement("book");// <book><book>
        newbook.setAttribute("id", "a3");

        // 创建一个name节点
        Element newName = document.createElement("name");
        newName.setTextContent("编程高手秘籍");

        // 将新的name加载到新的book
        newbook.appendChild(newName);

        // 添加节点到指定位置
        Element root = document.getDocumentElement();// 找到根节点
        root.appendChild(newbook);// 添加子节点到根节点
        // 回写xml
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        DOMSource domSource = new DOMSource(document);// 用DOM构造数据源
        StreamResult result = new StreamResult(new File("books_bak.xml"));
        transformer.transform(domSource, result);
    }
}

以上笔记来自于视频教程,只为自己以后更方便的查询和学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值