XML与Java解析

XML规范统一,与操作系统、编程语言的开发平台无关。

在存储数据、交换数据、数据配置方面有优势。

格式如下

<?xml version="1.0" encoding="UTF-8"?>
<books><!--图书信息 --><book id="101"><author>明日科技</author><title>Java从入门到精通</title><description>零基础入门,适合自学</description></book><book id="102"><author>关东升</author><title>Java从小白到大牛</title><description>Oracle公司官方推荐用书</description></book>
</books>

XML元素:由开始标签、元素内容和标签组成。元素内容可以包含子元素、字符数据等。

解析XML技术

1、DOM 基于XML树结构、比较耗资源、适用于多次访问XML

2、SAX 基于事件,消耗资源小,适用于数据量较大的XML

3、JDOM 比DOM更快,仅使用具体类而不使用接口

4、DOM4J 非常优秀的Java XML API 使用最多  

DOM解析XML

DOM是Document Object Model即文档对象模型的简称。
DOM把XML文档映射成一个倒挂的树。

Dom4J是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。 

甲骨文公司提供了JAXP(Java API for XML Processing)来解析XML。
JAXP会把XML文档转换成一个DOM树。
JAXP包含3个包,这3个包都在JDK中:
org.w3c.dom:W3C推荐的用于使用DOM解析XML文档的接口。
org.xml.sax:用于使用SAX解析XML文档的接口。
javax.xml.parsers:解析器工厂工具,程序员获得并配置特殊的解析器。

Document接口:Document对象代表整个XML文档,它也是对XML文档进行操作的起点。
Document接口继承自Node接口

常用方法

方法说明

Element createElement(String tagName)

创建指定标记名称的元素。

Element getDocumentElement()

获取代表XML文档根元素的对象。

NodeList getElementsByTagName(String tagName)

按文档顺序返回文档中指定标记名称

的所有元素集合

org.w3c.dom包中的常用接口
Node接口:表示树中的一个抽象节点。
 

常用方法

方法说明

Node appendChild(Node newChild)

将节点 newChild 添加到此节点的子节点列表的末尾。

NodeList getChildNodes()

获取该元素的所有子节点,返回节点的列表。

Node getFirstChild()

此节点的第一个子节点。

Node getLastChild()

此节点的最后一个节点。

Node getParentNode()

此节点的父节点。

String getNodeName()

获取节点的名称。

String getTextContent()

此属性返回此节点及其后代的文本内容。

Node removeChild(Node newChild)

从子节点列表中移除 oldChild 所指示的子节点,并将其返回。

 org.w3c.dom包中的常用接口
NodeList接口:包含了一个或者多个节点的列表。

常用方法

方法说明

int getLength (String tagName)

返回列表的长度。

Node item(int index)

返回集合中的第 index 个项。如果 index 大于或等于此列表中的节点数,则返回 null

org.w3c.dom包中的常用接口4-4
Element接口:代表XML文档中的标签元素。
Element接口继承自Node,也是Node最主要的子对象。在标签中可以包含属性。

常用方法

方法说明

String getAttribute(String name)

通过名称获得属性值。

Attr getAttributeNode(String name)

通过名称获得属性节点。

NodeList getElementsByTagName(String tagName)

以文档顺序返回具有给定标记名称的所有后代 Elements NodeList

void setAttribute(String name, String value)

添加一个新属性。

常用接口

接口名

说明

Attribute

定义了 XML 的属性。

Document

定义了XML 文档。

Element

定义了XML 元素。

Node

DOM4J中所有的XML节点定义了多态行为

XML增删改查实例

package com.kgc.day05.dom4j;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;import java.io.File;/*** @author: zjl* @datetime: 2023/12/27* @desc:*/
public class Dom4jUtil {public static Document createDocument(String xmlPath) {//1.指定要解析的XML文件File file = new File(xmlPath);//2.创建文档对象模型SAXReader sax = new SAXReader();Document document = null;try {document = sax.read(file);} catch (DocumentException e) {//e.printStackTrace();System.out.println("文档不存在!");}return document;}}
package com.kgc.day05.dom4j;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;import java.io.File;/*** @author: zjl* @datetime: 2023/12/27* @desc:*/
public class Dom4jUtil {public static Document createDocument(String xmlPath) {//1.指定要解析的XML文件File file = new File(xmlPath);//2.创建文档对象模型SAXReader sax = new SAXReader();Document document = null;try {document = sax.read(file);} catch (DocumentException e) {//e.printStackTrace();System.out.println("文档不存在!");}return document;}}
package com.kgc.day05.dom4j;/*** @author: zjl* @datetime: 2023/12/27* @desc:*/
public class Member {private String card;private String name;private String password;private int count;public Member() {}public Member(String card, String name, String password, int count) {this.card = card;this.name = name;this.password = password;this.count = count;}@Overridepublic String toString() {return "Member{" +"card='" + card + '\'' +", name='" + name + '\'' +", password='" + password + '\'' +", count=" + count +'}';}public String getCard() {return card;}public void setCard(String card) {this.card = card;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getCount() {return count;}public void setCount(int count) {this.count = count;}
}
package com.kgc.day05.dom4j;import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;/*** @author: zjl* @datetime: 2023/12/27* @desc:*/
public class MemberDom4J {//先创建一个空的Member集合,用来存储解析出来的每一个Member对象List<Member> memberList = new ArrayList<>();//解析XML文件public void loadXml(String xmlPath) {Document document = Dom4jUtil.createDocument(xmlPath);if(document == null){System.out.println("文档解析失败!");return;}Member member = null;//1.获取到根节点  membersElement rootElement = document.getRootElement();//2.获取到根节点的所有子节点  每一个member元素List<Element> memberEleList = rootElement.elements();for (Element memberEle : memberEleList) {//3.创建每一个member元素对应的Member对象member = new Member();//4.解析member元素的card属性值,并赋值给Member对象的card属性member.setCard(memberEle.attributeValue("card"));//直接从member元素中获取指定名称的子元素,如下面这个就是获取指定的name标签的文本内容,并赋值给Member的name属性member.setName(memberEle.element("name").getText());member.setPassword(memberEle.element("password").getText());int count = 0;try {count = Integer.parseInt(memberEle.element("count").getText());}catch (Exception e){}member.setCount(count);/*//5.解析member元素的所有子节点  name、password、count元素List<Element> attrElementList = memberEle.elements();for (Element attrEle : attrElementList) {//6.获取member元素的子节点的元素名称/标签名称String eleName = attrEle.getName();//7.根据标签名称,将标签的文本内容赋值给对应的属性switch (eleName){case "name":member.setName(attrEle.getText());break;case "password":member.setPassword(attrEle.getText());break;case "count":int count = 0;try {count = Integer.parseInt(attrEle.getText());}catch (Exception e){}member.setCount(count);break;}}*///8.每解析玩一个member元素,就表示创建完了一个Member对象,将这个对象添加到事先准备好的集合中memberList.add(member);}}//添加一个Member对象public void addMember(Member member){Document document = Dom4jUtil.createDocument("files/xml/members.xml");Element rootElement = document.getRootElement();Element memberEle = rootElement.addElement("member");memberEle.addAttribute("card",member.getCard());memberEle.addElement("name").setText(member.getName());memberEle.addElement("password").setText(member.getPassword());memberEle.addElement("count").setText(member.getCount()+"");saveXml(document,"files/xml/saveMember.xml");}//修改public void updateMember(Member member){Document document = Dom4jUtil.createDocument("files/xml/members.xml");Element rootElement = document.getRootElement();List<Element> memberEleList = rootElement.elements();for (Element memberEle : memberEleList) {if(memberEle.attributeValue("card").equals(member.getCard())){memberEle.element("name").setText(member.getName());memberEle.element("password").setText(member.getPassword());memberEle.element("count").setText(member.getCount()+"");break;}}saveXml(document,"files/xml/updateMember.xml");}//修改public void deleteMember(String card){Document document = Dom4jUtil.createDocument("files/xml/members.xml");Element rootElement = document.getRootElement();List<Element> memberEleList = rootElement.elements();for (Element memberEle : memberEleList) {if(memberEle.attributeValue("card").equals(card)){//rootElement.remove(memberEle);memberEle.getParent().remove(memberEle);break;}}saveXml(document,"files/xml/deleteMember.xml");}public void saveXml(Document document ,String savePath){//1.创建XMLWriter对象XMLWriter xmlWriter = null;OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("UTF-8");try {xmlWriter = new XMLWriter(new FileWriter(savePath),format);xmlWriter.write(document);} catch (IOException e) {e.printStackTrace();}finally {try {if(xmlWriter!=null){xmlWriter.close();}} catch (IOException e) {e.printStackTrace();}}}public void print() {memberList.forEach(member -> {System.out.println(member);});}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/582489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot整合minio做文件存储

一,minio介绍 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象文件可以是任意大小&…

TimeoutException(超时异常)可能的原因和解决方法

TimeoutException 通常表示一个操作在规定的时间内没有完成。以下是可能导致 TimeoutException 的一些常见原因以及相应的解决方法&#xff1a; 网络连接超时&#xff1a; 可能原因&#xff1a; 尝试与远程主机建立网络连接时&#xff0c;连接超过了指定的时间。解决方法&#…

verilog rs232串口模块

前面发了个发送模块&#xff0c;这次补齐&#xff0c;完整。 串口计数器&#xff0c;波特率适配 uart_clk.v module uart_clk(input wire clk,input wire rst_n,input wire tx_clk_en,input wire rx_clk_en,input wire[1:0] baud_sel,output wire tx_clk,output wire rx_clk )…

Kubernetes快速实战与核心原理剖析

K8S 概览 K8S 是什么 K8S 官网文档&#xff1a;https://kubernetes.io/zh/docs/home/ K8S 是 Kubernetes 的全称&#xff0c;源于希腊语&#xff0c;意为“舵手”或“飞行员”。Kubernetes 是用于自动部署、扩缩和管理容器化应用程序的开源系统。 Kubernetes 源自 Google 15 年…

知识笔记(六十三)———JavaScript 工具库 | PrefixFree给CSS自动添加浏览器前缀

为了解决这个问题&#xff0c;国外的牛人开发了了一个 -Prefix-free 的插件&#xff0c;能够自动给我们添加这些前缀&#xff0c;我们仅仅需要编写一次代码&#xff0c;无需在考虑是否兼容其他浏览器&#xff0c;而且如果后面浏览器支持这个属性了&#xff0c;我们只需要移除 -…

EDKII:第一个Helloworld

目录 0 说明 1 步骤 1.1 简介 1.2 创建新文件 1.3 创建printhelloworld.c、printhelloworld.inf&#xff1a; 1.4 修改MdeModulePkg\MdeModulePkg.dsc 1.5 修改EmulatorPkg\EmulatorPkg.dsc 1.6 运行 0 说明 上篇文章记录了如何安装UEFI环境&#xff0c;在这里将会写下…

c++ / day03

1. 定义一个Person类&#xff0c;包含私有成员&#xff0c;int *age&#xff0c;string &name&#xff0c;一个Stu类&#xff0c;包含私有成员double *score&#xff0c;Person p1&#xff0c;写出Person类和Stu类的特殊成员函数&#xff0c;并写一个Stu的show函数&#xf…

CodeWhisperer——轻松使用一个超级强大的工具

CodeWhisperer 简介 CodeWhisperer是亚⻢逊云科技出品的一款基于机器学习的通用代码生成器&#xff0c;可实时提供代码建议。 CodeWhisperer有以下几个主要用途&#xff1a; 解决编程问题&#xff0c;提供代码建议&#xff0c;学习编程知识等等&#xff0c;并且CodeWhisper…

基于人工势场法的航线规划

MATLAB2016b可以运行 基于人工势场法的航线规划资源-CSDN文库

JavaSE学习笔记 2023-12-21 --流

十九、流 上一篇 个人整理非商业用途&#xff0c;欢迎探讨与指正&#xff01;&#xff01; 文章目录 十九、流19.1流的概念19.2File类19.2.1File对象的创建19.2.2Java中的路径表示19.2.3File中的常用方法19.2.4FileNameFilter接口 19.3IO流19.3.1流的划分19.3.2字节流[重点]…

常用的 linux 命令

常用的 linux 命令 1.从其他机器拷贝文件夹2.查看哪个程序在用特定端口3.实时监控日志文件内容4.查看指定用户拥有的进程5.查看磁盘空间使用情况6.文件搜索which&#xff08;whereis&#xff09; 显示系统命令所在目录find 查找任何文件或目录1&#xff09; 根据文件名称查找2)…

具身智能主流方法:模仿学习,和强化学习

1.区别 模仿学习&#xff1a;倾向于从优秀的个体展现出来的技能中快速学习&#xff0c;并获得泛化能力&#xff0c;但模仿学习目前学到的仅是相同技能的不用应用&#xff0c;比方说&#xff0c;“放苹果”泛化到“放梨”&#xff0c;“放牛奶”&#xff0c;都是“放”这个技能的…

磁盘——磁盘管理与文件系统

目录 一、在linux中使用硬盘分三步 1、分区 2、文件系统&#xff08;管理大小权限。日志恢复&#xff09; 3、挂载&#xff08;硬盘和系统文件做关联&#xff0c;使用文件夹使用系统&#xff09; 二、磁盘结构 三、MBR与GPT磁盘分区 1、分区的原因&#xff0c;为什么分区…

Ubuntu18.04安装GTSAM库并验证GTSAM是否安装成功(亲测可用)

在SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;和SFM&#xff08;Structure from Motion&#xff09;这些复杂的估计问题中&#xff0c;因子图算法以其高效和灵活性而脱颖而出&#xff0c;成为图模型领域的核心技术。GTSAM&#xff08;Georgia Tech Smo…

Java八股文面试全套真题【含答案】- RocketMQ篇

以下是关于Java八股文面试全套真题- RocketMQ篇 1.RocketMQ 是什么&#xff1f;它的特点和优势是什么&#xff1f; RocketMQ 是一个开源的分布式消息中间件系统&#xff0c;具有高吞吐量、低延迟、可靠性强等特点。 特点和优势&#xff1a; 高吞吐量&#xff1a;支持每秒百万级…

Mybatis 动态 SQL - foreach

动态SQL的另一个常见需求是需要迭代一个集合&#xff0c;通常用于构建IN条件。例如&#xff1a; <select id"selectPostIn" resultType"domain.blog.Post">SELECT *FROM POST P<where><foreach item"item" index"index&quo…

Vue 3 中安装并使用 Axios 详细步骤+样例代码详解

axios详细步骤 在集成终端打开&#xff0c;使用 npm 或 yarn 安装 Axios&#xff1a; npm install axios或 yarn add axios这将在您的项目中安装 Axios。 在您的 Vue 3 项目中创建一个用于发送 HTTP 请求的模块或文件&#xff0c;比如 http.js。 在 http.js 文件中导入 Axios…

K8s实战-init容器

概念&#xff1a; 初始化容器的概念 比如一个容器A依赖其他容器&#xff0c;可以为A设置多个 依赖容易A1&#xff0c;A2&#xff0c;A3 A1,A2,A3要按照顺序启动&#xff0c;A1没有启动启动起来的 话&#xff0c;A2,A3是不会启动的&#xff0c;直到所有的静态容器全 部启动完毕…

Java并发编程(四)

ThreadLocal 1.ThreadLocal是什么 ThreadLocal类让每一个线程都拥有了自己的本地变量&#xff0c;这意味着每个线程都可以独立地、安全地操作这些变量&#xff0c;而不会影响其他线程。 ThreadLocal的常用API get()&#xff1a;获取当前线程中与ThreadLocal对象关联的变量副…

Java EasyExcel 导入代码

Java EasyExcel 导入代码 导入方法 /*** 仓库库位导入** param req* param res* param files* throws Exception*/RequestMapping(value {"/import/line_store_locs"}, method {RequestMethod.POST})ResponseBodypublic void importStoreLoc(HttpServletRequest …