第一百八十五节 Java XML教程 - Java DOM简介
Java XML教程 - Java DOM简介
DOM是标准的树结构,其中每个节点包含来自XML结构的一个组件。
XML文档中两种最常见的节点类型是元素节点和文本节点。
使用Java DOM API,我们可以创建节点,删除节点,更改其内容,并遍历节点层次结构。
何时使用DOM
文档对象模型标准是为XML文档操作而设计的。
DOM的用意是语言无关的。Java的DOM解析器没有利用Java的面向对象的特性优势。
混合内容模型
文本和元素在DOM层次结构中混合。这种结构在DOM模型中称为混合内容。
例如,我们有以下xml结构:
<yourTag>This is an <bold>important</bold> test.</yourTag>
DOM节点的层级如下,其中每行代表一个节点:
ELEMENT: yourTag+ TEXT: This is an+ ELEMENT: bold+ TEXT: important+ TEXT: test.
yourTag
元素包含文本,后跟一个子元素,后跟另外的文本。
节点类型
为了支持混合内容,DOM节点非常简单。标签元素的“内容"标识它是的节点的类型。
例如,<yourTag> 节点内容是元素 yourTag
的名称。
DOM节点API定义 nodeValue()
, nodeType()
和 nodeName()
方法。
对于元素节点< yourTag>
nodeName()返回yourTag,而nodeValue()返回null。
对于文本节点 + TEXT:这是一个
nodeName()返回#text,nodeValue()返回“This is an"。
例子
以下代码显示了如何使用DOM解析器来解析xml文件并获取一个 org.w3c.dom.Document
对象。
import java.io.File;import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;public class Main {public static void main(String[] args) throws Exception {DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = null;db = dbf.newDocumentBuilder();Document doc = db.parse(new File("games.xml"));} }
例2
以下代码显示如何执行DOM转储。
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException;public class Main{static public void main(String[] arg) throws Exception{String filename = "input.xml";boolean validate = true;DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();dbf.setValidating(validate);dbf.setNamespaceAware(true);dbf.setIgnoringElementContentWhitespace(true);DocumentBuilder builder = dbf.newDocumentBuilder();builder.setErrorHandler(new MyErrorHandler());InputSource is = new InputSource(filename);Document doc = builder.parse(is);TreeDumper td = new TreeDumper();td.dump(doc);} } class TreeDumper {public void dump(Document doc) {dumpLoop((Node)doc,"");}private void dumpLoop(Node node,String indent) {switch(node.getNodeType()) {case Node.CDATA_SECTION_NODE:System.out.println(indent + "CDATA_SECTION_NODE");break;case Node.COMMENT_NODE:System.out.println(indent + "COMMENT_NODE");break;case Node.DOCUMENT_FRAGMENT_NODE:System.out.println(indent + "DOCUMENT_FRAGMENT_NODE");break;case Node.DOCUMENT_NODE:System.out.println(indent + "DOCUMENT_NODE");break;case Node.DOCUMENT_TYPE_NODE:System.out.println(indent + "DOCUMENT_TYPE_NODE");break;case Node.ELEMENT_NODE:System.out.println(indent + "ELEMENT_NODE");break;case Node.ENTITY_NODE:System.out.println(indent + "ENTITY_NODE");break;case Node.ENTITY_REFERENCE_NODE:System.out.println(indent + "ENTITY_REFERENCE_NODE");break;case Node.NOTATION_NODE:System.out.println(indent + "NOTATION_NODE");break;case Node.PROCESSING_INSTRUCTION_NODE:System.out.println(indent + "PROCESSING_INSTRUCTION_NODE");break;case Node.TEXT_NODE:System.out.println(indent + "TEXT_NODE");break;default:System.out.println(indent + "Unknown node");break;}NodeList list = node.getChildNodes();for(int i=0; i<list.getLength(); i++)dumpLoop(list.item(i),indent + " ");} } class MyErrorHandler implements ErrorHandler {public void warning(SAXParseException e) throws SAXException {show("Warning", e);throw (e);}public void error(SAXParseException e) throws SAXException {show("Error", e);throw (e);}public void fatalError(SAXParseException e) throws SAXException {show("Fatal Error", e);throw (e);}private void show(String type, SAXParseException e) {System.out.println(type + ": " + e.getMessage());System.out.println("Line " + e.getLineNumber() + " Column "+ e.getColumnNumber());System.out.println("System ID: " + e.getSystemId());} }
错误处理程序
以下代码显示了如何在使用DOM解析器解析XML时处理错误。
import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException;public class DOMCheck {static public void main(String[] arg) {boolean validate = true;DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();dbf.setValidating(validate);dbf.setNamespaceAware(true);try {DocumentBuilder builder = dbf.newDocumentBuilder();builder.setErrorHandler(new MyErrorHandler());InputSource is = new InputSource("person.xml");Document doc = builder.parse(is);} catch (SAXException e) {System.out.println(e);} catch (ParserConfigurationException e) {System.err.println(e);} catch (IOException e) {System.err.println(e);}} }class MyErrorHandler implements ErrorHandler {public void warning(SAXParseException e) throws SAXException {show("Warning", e);throw (e);}public void error(SAXParseException e) throws SAXException {show("Error", e);throw (e);}public void fatalError(SAXParseException e) throws SAXException {show("Fatal Error", e);throw (e);}private void show(String type, SAXParseException e) {System.out.println(type + ": " + e.getMessage());System.out.println("Line " + e.getLineNumber() + " Column " + e.getColumnNumber());System.out.println("System ID: " + e.getSystemId());} }
例3
以下代码显示了如何递归访问DOM树中的所有节点。
import java.io.File;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList;public class Main {public static void main(String[] argv) throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();factory.setValidating(true);factory.setExpandEntityReferences(false);Document doc = factory.newDocumentBuilder().parse(new File("file.xml"));visit(doc, 0);}public static void visit(Node node, int level) {NodeList list = node.getChildNodes();for (int i = 0; i < list.getLength(); i++) {Node childNode = list.item(i);visit(childNode, level + 1);}} }
例4
下面的代码显示了如何将XML片段转换为DOM片段。
import java.io.File; import java.io.StringReader;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document; import org.w3c.dom.DocumentFragment; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xml.sax.InputSource;public class Main {public static void main(String[] argv) throws Exception {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();factory.setValidating(true);Document doc = factory.newDocumentBuilder().parse(new File("infilename.xml"));String fragment = "<fragment>aaa</fragment>";factory = DocumentBuilderFactory.newInstance();Document d = factory.newDocumentBuilder().parse(new InputSource(new StringReader(fragment)));Node node = doc.importNode(d.getDocumentElement(), true);DocumentFragment docfrag = doc.createDocumentFragment();while (node.hasChildNodes()) {docfrag.appendChild(node.removeChild(node.getFirstChild()));}Element element = doc.getDocumentElement();element.appendChild(docfrag);}}
例5
下面的代码显示了如何解析XML字符串:使用DOM和StringReader。
import java.io.StringReader;import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.CharacterData; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource;public class Main {public static void main(String arg[]) throws Exception{String xmlRecords = "<data><employee><name>A</name>"+ "<title>Manager</title></employee></data>";DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();InputSource is = new InputSource();is.setCharacterStream(new StringReader(xmlRecords));Document doc = db.parse(is);NodeList nodes = doc.getElementsByTagName("employee");for (int i = 0; i < nodes.getLength(); i++) {Element element = (Element) nodes.item(i);NodeList name = element.getElementsByTagName("name");Element line = (Element) name.item(0);System.out.println("Name: " + getCharacterDataFromElement(line));NodeList title = element.getElementsByTagName("title");line = (Element) title.item(0);System.out.println("Title: " + getCharacterDataFromElement(line));}}public static String getCharacterDataFromElement(Element e) {Node child = e.getFirstChild();if (child instanceof CharacterData) {CharacterData cd = (CharacterData) child;return cd.getData();}return "";} }
上面的代码生成以下结果。
相关文章:

第一百八十五节 Java XML教程 - Java DOM简介
Java XML教程 - Java DOM简介 DOM是标准的树结构,其中每个节点包含来自XML结构的一个组件。 XML文档中两种最常见的节点类型是元素节点和文本节点。 使用Java DOM API,我们可以创建节点,删除节点,更改其内容,并遍历节…...

一款功能强大且免费的图片查看和管理工具
XnView MP是一款功能强大且免费的图片查看和管理工具,支持多种平台(Windows、Mac和Linux),并基于相同的源代码实现统一的用户界面和体验。它不仅能够查看各种图片格式,还提供了丰富的编辑和管理功能。 图片查看与浏览…...
动手学强化学习 第 11 章 TRPO 算法(TRPOContinuous) 训练代码
基于 Hands-on-RL/第11章-TRPO算法.ipynb at main boyu-ai/Hands-on-RL GitHub 理论 TRPO 算法 修改了警告和报错 运行环境 Debian GNU/Linux 12 Python 3.9.19 torch 2.0.1 gym 0.26.2 运行代码 TRPOContinuous.py #!/usr/bin/env pythonimport torch import numpy a…...

数量关系模块
三年后指的不是现在 选A注意单位 注意单位换算 A 正方形减去扇形 256-X5y 那么小李拿的一定是末尾是1或者是6,所以小李拿的是26,那么y46,那么小王或者小周拿的是92,所以选择三个数之和等于92的,所以选择D 分数 百分数 …...
滑模面、趋近律设计过程详解(滑模控制)
目录 1. 确定系统的状态变量和目标2. 定义滑模面3. 选择滑模面的参数4. 设计控制律5. 验证滑模面设计6. 总结 设计滑模面(Sliding Surface)是滑模控制(Sliding Mode Control,SMC)中的关键步骤。滑模控制是一种鲁棒控制…...

SQL Server 端口配置
目录 默认端口 更改端口 示例:更改 TCP 端口 示例:验证端口设置 远程连接测试 示例:使用 telnet 测试连接 配置防火墙 示例:Windows 防火墙设置 远程连接测试 示例:使用 telnet 测试连接 默认端口 TCP/IP: …...

同一窗口还是新窗口打开链接更利于SEO优化
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…...
kafka 安装
docker安装kafka(KRaft 模式) KRaft模式不再对Zookeeper依赖。 docker run -d --name kafka-kraft \-p 9092:9092 -p 9093:9093 \-e KAFKA_PROCESS_ROLESbroker,controller \-e KAFKA_NODE_ID1 \-e KAFKA_CONTROLLER_QUORUM_VOTERS1127.0.0.1:9093 \-e KAFKA_LISTENERSPLAINTEX…...
消息队列中间件 - Kafka:高效数据流处理的引擎
作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有疑问和建议,请私信或评论留言! 前言 在现代大数据和…...
el-table表格动态合并相同数据单元格(可指定列+自定义合并)
el-table表格动态合并相同数据单元格(可指定列自定义合并)_el-table 合并单元格动态-CSDN博客 vue2elementUI表格实现实现多列动态合并_element table动态合并列-CSDN博客...

复习Nginx
1.关于Nginx Nginx的关键特性 1.支持高并发 2.内存资源消耗低 3.高扩展性(模块化设计) 4.高可用性(master-worker) Nginx运行架构 注意 默认情况下,Nginx会创建和服务器cpu核心数量相等的worker进程 worker进程之间…...
nvm:Node.js 版本管理工具
nvm(Node Version Manager)是一个用于管理多个 Node.js 版本的工具,它允许你在同一个系统上安装和使用不同版本的 Node.js。这对于开发者来说非常有用,特别是当不同的项目需要不同版本的 Node.js 时。 以下是 nvm 的一些主要特性…...

springboot校园商店配送系统-计算机毕业设计源码68448
摘要 本文详细阐述了基于Spring Boot框架的校园商店配送系统的设计与实现过程。该系统针对校园内的用户需求,整合了用户注册与登录、商品浏览与购买、订单管理、配送追踪、用户反馈收集以及后台管理等功能,为校园内的普通用户、商家、配送员和管理员提供…...

【Redis 初阶】客户端(C++ 使用样例列表)
一、编写 helloworld 需要先使用 redis-plus-plus 连接一下 Redis 服务器,再使用 ping 命令检测连通性。 1、Makefile Redis 库最多可以支持到 C17 版本。(如果是用 Centos,需要注意 gcc/g 的版本,看是否支持 C17。不支持的话&a…...

【STM32】STM32单片机入门
个人主页~ 这是一个新的系列,stm32单片机系列,资料都是从网上找的,主要参考江协科技还有正点原子以及csdn博客等资料,以一个一点没有接触过单片机但有一点编程基础的小白视角开始stm32单片机的学习,希望能对也没有学过…...

学生信息管理系统(Python+PySimpleGUI+MySQL)
吐槽一下 经过一段时间学习pymysql的经历,我深刻的体会到了pymysql的不靠谱之处; 就是在使用int型传参,我写的sql语句中格式化%d了之后,我在要传入的数据传递的每一步的去强制转换了,但是他还是会报错,说我…...

Java8.0标准之重要特性及用法实例(十九)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列…...
Linux系统中,`buffer`和`cache` 区别
在Linux系统中,buffer和cache都是操作系统用来提高磁盘I/O性能的机制,它们通过将数据暂存于内存中来减少对磁盘的直接访问。尽管它们的目的相似,但它们在实现和用途上有所不同。 Buffer 定义:buffer主要用于存储即将被写入磁盘的…...
python创建进度条的两个手搓方法
# 使用\b 回删进行手搓 import sys,time for i in range(1, 101):# 这里的10代表你的进度: 一个汉字2字节print(你的进度:,str(i)\b*(i10),flushTrue,end)time.sleep(0.5) # 利用\r手搓 import sys,time for i in range(1, 101):# \r光标回到开头print("\r", end&qu…...

JAVA—面向对象编程基础
面向对象是java编程的套路。更符合人类思维习惯,编程更直观。面向对象有三大特征:封装,继承,多态。 目录 1.理解面向对象 2.对象在计算机中的执行原理 3.类和对象的一些注意事项 4.类与对象的一些语法知识 (1&am…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...