javaee中针对xml的解析方式---DOM

134 篇文章 1 订阅
55 篇文章 0 订阅

java针对xml的解析方式有如下三种
1.JAXP DOM解析
2.JAXP SAX解析
3.XML PULL 进行STAX解析

xml技术主要企业的应用
1.存储和数据的传输
2.作为框架的配置文件

使用xml存储和传输数据
1.通过程序生成xml
2.读取xml中的数据
什么是DOM和SAX
DOM Document Object Model —– 文档对象模型
DOM思想: 将整个xml 加载内存中,形成文档对象,所有对xml操作都对内存中文档对象进行
DOM 是官方xml解析标准
* 所有开发语言都支持的
Java、JavaScript 都支持DOM

SAX Simple API for XML —– XML 简单 API
程序员为什么发明sax解析方式?? 当xml 文档非常大,不可能将xml所有数据加载到内存
SAX 思想:一边解析 ,一边处理,一边释放内存资源 —- 不允许在内存中保留大规模xml 数据
StAX The Stream API for XML —– XML 流 API
STAX 是一种 拉模式 xml 解析方式,SAX 是一种 推模式 XML 解析方式

推push模式:由服务器为主导,向客户端主动发送数据
拉pull模式: 由客户端为主导,主动向服务器申请数据

程序员在实际开发中,使用已经开发好工具包 —– JAXP 、DOM4j 、XML PULL

解析方式 与 解析开发包 关系?
解析方式是解析xml 思想,没有具体代码,解析开发包是解析xml思想具体代码实现

JAXP 是sun官方推出实现技术 同时支持 DOM SAX STAX
DOM4j 是开源社区开源框架 支持 DOM 解析方式
XML PULL Android 移动设备内置xml 解析技术 支持 STAX 解析方式

当SAX和STAX 读取xml数据时,如果读取到内存数据不释放 —– 内存中将存在整个xml文档数据 (类似DOM 支持修改和回写)

DOM、SAX、STAX 在实际开发中选择?
在javaee日常开发中 —- 优先使用DOM (编程简单)
当xml 文档数据非常多,不可能使用DOM —造成内存溢出 —— 优先使用STAX
移动开发 使用 STAX —- Android XML PULL

JAXP 开发 进行 xml解析 :
javax.xml.parsers 存放 DOM 和 SAX 解析器
javax.xml.stream 存放 STAX 解析相关类
org.w3c.dom 存放DOM解析时 数据节点类
org.xml.sax 存放SAX解析相关工具类

DOM 解析快速入门

1、创建 xml 文档 books.xml
在企业实际开发中,为了简化xml 生成和解析 —- xml 数据文件通常不使用约束的
2、使用DOM解析xml
将整个xml文档加载到内存中 : 工厂 — 解析器 — 解析加载
3、Document通过 getElementsByTagName 获得 节点集合 NodeList
通过 NodeList 提供 getLength 和 item 遍历 节点集合

遍历ArrayList
for (int i=0;i

@Test
    public void demo() throws Exception {
        // 构造工厂
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        // 功过工厂获取解析器
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        // 使用解析器加载xml文档,封装为Document的形式文档
        Document document = builder.parse("book.xml");
        // 将所有形式的图书名称打印出来
        NodeList nodeList = document.getElementsByTagName("name");// 查询所有的name标签
        // 这里的nodelist包含xml文档中所有name标签列表
        // 遍历nodelist中的所有元素
        // tongguo nodelist提供的getLength和item遍历节点集合
        // 图书name节点的数量
        System.out.println("nodelist中name的节点的数目:" + nodeList.getLength());
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            Element element = (Element) node;
            System.out.println("节点元素名称" + element.getNodeName());
            System.out.println("节点元素类型" + element.getNodeType());
            System.out.println("元素节点值" + element.getNodeValue());/// 所有元素节点值都是null
            System.out.println("获取元素的节点的属性值" + element.getAttribute("name"));
            System.out.println("元素节点值" + element.getTextContent());
            System.out.println("========================================");
        }

    }

==========================

/**
     * 查询java编程基础的价格
     * <p>
     * Title: demo2
     * </p>
     * <p>
     * Description:
     * </p>
     * 
     * @throws Exception
     */
    @Test
    public void demo2() throws Exception {
        int q = 2;
        System.out.println((q >> 3) + "a");
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse("book.xml");
        NodeList nodeList = document.getElementsByTagName("book");
        // 遍历然后强转
        for (int i = 0; i < nodeList.getLength(); i++) {
            Element element = (Element) nodeList.item(i);
            NodeList nodeList2 = element.getChildNodes();
            Element element2 = (Element) nodeList2.item(1);
            if (element2.getTextContent().equals("java编程基础")) {
                Element price = (Element) nodeList2.item(3);
                System.out.println(price.getTextContent());
            }
        }
    }

=================================

/**
     * 将books.xml加载到内存中,将文档内容写入到另一个xml文件中 books_bak.xml文件
     * 
     * @throws Exception
     */
    @Test
    public void demo4() throws Exception {
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        Document document = builder.parse(new File("book.xml"));
        // 回写到xml用到Transformer
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource domSource = new DOMSource(document);
        StreamResult result = new StreamResult(new File("book_bak.xml"));
        transformer.transform(domSource, result);
    }
}

===============================

/**
     * 向xml文件添加一个book元素
     * <p>
     * Title: testadd
     * </p>
     * <p>
     * Description:
     * </p>
     */
    @Test
    public void testadd() throws Exception {
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        Document document = builder.parse("book.xml");
        // 添加节点创建节点
        Element element = document.createElement("book");// <book></book>
        // 添加属性
        element.setAttribute("id", "b0000");
        // 创建name节点
        Element newname = document.createElement("name");
        newname.setTextContent("编程高手秘籍");

        //
        element.appendChild(newname);
        // 3添加节点到指定位置--获取根节点
        Element root = document.getDocumentElement();
        root.appendChild(element);
        // 4.回写xml
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer fromer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(document);
        StreamResult result = new StreamResult(new File("book_bak.xml"));

        fromer.transform(source, result);

    }

==================================

/**
     * 元素的修改 将java高级编程价格上升到120
     */
    @Test
    public void demo2() throws Exception {
        // 加载xml到内存
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse("book.xml");
        // 2查找小妖修改的书名称
        NodeList elementsByTagName = document.getElementsByTagName("name");
        for (int i = 0; i < elementsByTagName.getLength(); i++) {
            Element name = (Element) elementsByTagName.item(i);
            if (name.getTextContent().equals("java高级编程数据库")) {
                System.out.println("找到该值");
                // 找到该节点
                Element element = (Element) name.getNextSibling().getNextSibling();
                double money = Double.parseDouble(element.getTextContent());
                money = money * 1.2;
                element.setTextContent(String.valueOf(money));
            }
        }

    }

============================================

// 删除包含java的图书
    @Test
    public void testDelte() throws ParserConfigurationException, SAXException, IOException, TransformerException {
        // !.加载xml文件
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse("book.xml");
        /// 查找java高级编程数据库
        NodeList list = document.getElementsByTagName("name");
        for (int i = 0; i < list.getLength(); i++) {
            Element element = (Element) list.item(i);
            if (element.getTextContent().contains("java")) {
                System.out.println("aaaaa");
                // 这本书需要删除
                Element book = (Element) element.getParentNode();
                // 删除必须通过父节点
                book.getParentNode().removeChild(book);
                // i--是为了修复list长度
                i--;
            }
        }

        // 回写到xml文件中
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer fromer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(document);
        StreamResult result = new StreamResult(new File("book_bak.xml"));

        fromer.transform(source, result);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uniquewdl

匆忙的人生,总有你喜欢的文章

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值