热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

jaxp实现对xml文档的增,删,改,查操作(附源码)浅析

jaxp,属于javase中的一部分。是对xml进行解析的一个工具类;既然说到这里,还是讲全一点,讲讲上面说到的xml的解析技术。xml的一个标记型文档。在html的

jaxp,属于javase中的一部分。是对xml进行解析的一个工具类;

既然说到这里,还是讲全一点,讲讲上面说到的xml的解析技术。



xml的一个标记型文档。

    在html的层级结构中,它会在内存中分配一个树形结构,会把html中的标签,属性,文本等都封装成一个个对象:

列如:document对象,element对象,属性对象,文本对象,Node节点对象。为啥讲html了呢?因为在html中js使用dom解析标记型文档。当然html这次就不说了,咱们重点说一说xml中的解析方式及具体的解析过程


在xml中的解析技术中,主要有两种技术:dom和sax

    那么这两种解析技术,有什么区别呢?

        1.dom:

            (1)解析原理:更加xml的层级结构,在内存中分配一个树形结构,把xml的标签,属性,文本都封装成一个个对象。

            (2)优缺点:首先,因为对于它的解析方式,它会一次性把所有的层级结构全部解析,那么构造出来的树形结构都会全部加载在内存中,所以它如果面对大型的xml文档进行解析,就会出现OOM(内存溢出)现象。优点呢?也正是它的树形结构方式,所以开发中对于它的增删改查操作就比较容易了,它的优点也就是在此。

        2.sax:

            (1)解析原理:采用事件驱动方式,在读取的时候,一边解析。自上而下的,逐步解析,解析到某一个xml的标签或者属性或者文本等对象,然后就把对象名称返回。

            (2)优缺点:优点呢,就是和dom相反,不会造成内存溢出。因为他的解析方式,自上而下。缺点呢,不能实现增删改操作。



            这次先说dom解析过程:

                DocumentBuilder:解析器类,

  • 定义从XML文档获取DOM文档实例的API。 使用这个类,应用程序员可以从XML获得一个 Document
            

这个类是一个抽象类,所以不能构造对象,所以我们只有从它的具体实现类中寻找突破口

    DocumentBuilderFactory中的newDocumentBuilder()方法获取

    返回的是document是一个接口,父节点是Node。

    那么在document中有些方法在我们等等要执行的增删改查操作,所以我们先声明一下。

        1.得到标签,得到一个集合NodeList:getElementByTagName(String tagName)

        2.创建一个标签:createElement(String tagName)

        3.创建文本:createTextNode(String data)

        4.在标签中添加文本:appendChild(Node newChild)

        5.通过父节点删除节点:removeChild(Node oldChild)

        6.获取父节点:getParentNode()

        7.获取集合的长度:getLength()

        8.获取下标具体的值:item(int index)

        9.获取标签里面的内容:getTextContent()


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

那么了解了初步的准备,我们准备一个具体的demo来,这样会更加形象的了解运用

首先定义一个xml文件:dog.xml


   

        Tom

        write

         


   

        Jack

        blue

        



    创建一个类:TestJaxp

        首先实现增:我们在dog1标签下面添加12

              /** 

* 1.创建解析器工厂
* 2.根据解析器工厂创建解析器
* 3.解析xml返回document
* 4.得到第一个dog1元素
* 5.创建age标签createElement
* 6.创建文本createTextNode
* 7.把文本添加到age下面appendChild()

* 8.把age添加到第一个dog1下面


* 9.回写xml

*/

public static void createTag() throws 

ParserConfigurationException, SAXException, 

IOException, TransformerException{

//创建解析器工厂
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//创建解析器
DocumentBuilder db = dbf.newDocumentBuilder();
//解析xml返回document
Document document = db.parse("src/dog.xml");
//得到第一个dog1元素
Node dog1= document.getElementsByTagName("dog1").item(0);
//创建age标签
Node age1= document.createElement("age");
//创建文本
Text test1 = document.createTextNode("12");
//age1标签添加text1
age1.appendChild(test1);
//dog1添加age1
dog1.appendChild(sex1);

//回写xml
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
t.transform(new DOMSource(document), new StreamResult("src/dog.xml"));

}


    实现删:我们把刚刚创建的age标签删除

        思路:/*
 * 1、创建解析器工厂
 * 2、根据解析器工厂创建解析器
 * 3、解析xml,返回document 
 * 
 * 4、获取age元素
 * 5、获取age的父节点 
 * 6、删除使用父节点删除 removeChild方法
 * 
 * 7、回写xml
 * */

     public static void delectTag() throws Exception {
//创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//得到document
Document document = builder.parse("src/dog.xml");
//得到age元素
Node age1= document.getElementsByTagName("age").item(0);
//得到age1父节点
Node dog1= age1.getParentNode();
//删除操作
dog1.removeChild(age1);
//回写xml
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/dog.xml"));

}


实现改操作://修改第一个dog1下面的TomLiLi

    思路:/*
* 1.创建解析器工厂
* 2.根据解析器工厂创建解析器
* 3.解析xml返回document

* 4.得到第一个name元素 item方法

* 5.修改name中的文本   setTextContent方法

* 6.回写xml

*/

public static void updateTextNode() throws TransformerException, 

ParserConfigurationException, SAXException, IOException{

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse("src/dog.xml");
Node name1 = document.getElementsByTagName("name").item(0);
//System.out.println(name1);
name1.setTextContent("LiLi");

TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
t.transform(new DOMSource(document), new StreamResult("src/dog.xml"));

}


实现查操作,查操作中,可以具体到查询某一个元素的值,也可遍历所以同一个元素名称的值

也可以将所有元素名称打印出来:

        (1)那么我先查询某一个元素的值,查询第一个name下的值,输出到控制台

        思路: /**
* 1.创建解析器工厂
* 2.根据解析器工厂创建解析器
* 3.解析xml返回document
* 4.得到第一个name元素
* 5.得到第一个name元素的值

*/

         public static void selectSin() throws SAXException, IOException, ParserConfigurationException {
//创建工厂
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//创建解析器
DocumentBuilder db = dbf.newDocumentBuilder();
//解析xml返回docuemnt
Document document = db.parse("src/dog.xml");
//得到第一个name元素
Node name1 = document.getElementsByTagName("name").item(0);//得到第一个name元素
//得到第一个name元素里面的值
String str1 = name1.getTextContent();
System.out.println(str1);

}


实现对所有name标签中的值查询只需要增加一个循环结构,就可以将所有的遍历出来

            思路: /*
* 1.创建解析器工厂
* 2.根据解析器工厂创建解析器
* 3.解析xml返回document

* 4.得到所有的name元素
* 5.返回集合,遍历集合,得到每一个name元素

*/

private static void selectAll() throws ParserConfigurationException, SAXException, IOException {
/*
* 1.创建解析器工厂
* 2.根据解析器工厂创建解析器
* 3.解析xml返回document

* 4.得到所有的name元素
* 5.返回集合,遍历集合,得到每一个name元素

*/

//创建解析器工厂
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//创建解析器
DocumentBuilder db = dbf.newDocumentBuilder();
//解析xml返回document
Document document = db.parse("src/dog.xml");
//得到name元素
NodeList list = document.getElementsByTagName("name");

//遍历集合
for (int i = 0; i Node name1 = list.item(i);//得到每一个name元素
//得到name元素里面的值
String str = name1.getTextContent();
System.out.println(str);
}

}


最后一个,遍历节点,把所有的元素名称都获取到,也可属于查的一部分吧:

    思路:

/*

* 1、创建解析器工厂
* 2、根据解析器工厂创建解析器
* 3、解析xml,返回document 


* ===递归实现
* 4.得到根节点(打印node.getNodeName())
* 5.得到根节点子节点
* 6.得到根节点子节点的子节点

*/

所以在这个方法里面需要先写一个递归输出的方法

//递归遍历的方法
private static void list1(Node node) {
//判断是元素的时候才打印
if (node.getNodeType() == node.ELEMENT_NODE) {
System.out.println(node.getNodeName());
}
NodeList list = node.getChildNodes();
//遍历list
for (int i = 0; i //得到每一个节点
Node node1 = list.item(i);
list1(node1);
}

}


public static void listElement() throws SAXException, IOException, ParserConfigurationException{
//创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//得到document
Document document = builder.parse("src/dog.xml");

list1(document);

}


所以在xml中的DOM解析操作中,增删改查就这样了。


            

        





推荐阅读
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文介绍了Android开发中Intent的基本概念及其在不同Activity之间的数据传递方式,详细展示了如何通过Intent实现Activity间的跳转和数据传输。 ... [详细]
  • 本文详细介绍了在 Windows 2000 系统中启用 TELNET 服务时需要注意的 NTLM 配置问题,帮助用户解决常见的身份验证失败错误。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
author-avatar
秋梯田那路77
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有