Java 之 XMLStreamConstants 原理及使用详细介绍

目录

引言

XMLStreamConstants 接口常量

详细解释

使用示例

示例XML文档

示例代码

输出

总结


引言

在Java中,处理XML文档是一个常见的任务。StAX(Streaming API for XML)是一种高效的XML解析方式,它提供了一种基于事件的模型来解析XML文档。XMLStreamConstants 是StAX库中的一个重要接口,它定义了XML解析过程中可能出现的各种事件类型。本文将详细介绍 XMLStreamConstants 的原理及其使用方法,并提供一个完整的示例代码

XMLStreamConstants 接口常量

  • START_ELEMENT (值为 1)
    • 表示XML元素的开始标签。
  • END_ELEMENT (值为 2)
    • 表示XML元素的结束标签。
  • PROCESSING_INSTRUCTION (值为 3)
    • 表示处理指令。
  • CHARACTERS (值为 4)
    • 表示元素内的普通字符数据。
  • COMMENT (值为 5)
    • 表示XML注释。
  • SPACE (值为 6)
    • 表示XML中的空白字符。
  • START_DOCUMENT (值为 7)
    • 表示XML文档的开始。
  • END_DOCUMENT (值为 8)
    • 表示XML文档的结束。
  • ENTITY_REFERENCE (值为 9)
    • 表示实体引用。
  • ATTRIBUTE (值为 10)
    • 表示属性。
  • DTD (值为 11)
    • 表示文档类型声明(DOCTYPE)。
  • CDATA (值为 12)
    • 表示CDATA节区。
  • NAMESPACE (值为 13)
    • 表示命名空间。
  • NOTATION_DECLARATION (值为 14)
    • 表示符号声明。
  • ENTITY_DECLARATION (值为 15)
    • 表示实体声明。

详细解释

  • START_ELEMENT (值为 1)
    • 表示XML元素的开始标签。当解析器遇到一个元素的开始标签时,会触发这个事件。
  • END_ELEMENT (值为 2)
    • 表示XML元素的结束标签。当解析器遇到一个元素的结束标签时,会触发这个事件。
  • PROCESSING_INSTRUCTION (值为 3)
    • 表示处理指令。当解析器遇到处理指令时,会触发这个事件。
  • CHARACTERS (值为 4)
    • 表示元素内的普通字符数据。当解析器遇到元素内的文本内容时,会触发这个事件。
  • COMMENT (值为 5)
    • 表示XML注释。当解析器遇到注释时,会触发这个事件。
  • SPACE (值为 6)
    • 表示XML中的空白字符。当解析器遇到空白字符时,会触发这个事件。
  • START_DOCUMENT (值为 7)
    • 表示XML文档的开始。当解析器开始解析XML文档时,会触发这个事件。
  • END_DOCUMENT (值为 8)
    • 表示XML文档的结束。当解析器完成解析XML文档时,会触发这个事件。
  • ENTITY_REFERENCE (值为 9)
    • 表示实体引用。当解析器遇到实体引用时,会触发这个事件。
  • ATTRIBUTE (值为 10)
    • 表示属性。当解析器遇到属性时,会触发这个事件。
  • DTD (值为 11)
    • 表示文档类型声明(DOCTYPE)。当解析器遇到文档类型声明时,会触发这个事件。
  • CDATA (值为 12)
    • 表示CDATA节区。当解析器遇到CDATA节区时,会触发这个事件。
  • NAMESPACE (值为 13)
    • 表示命名空间。当解析器遇到命名空间声明时,会触发这个事件。
  • NOTATION_DECLARATION (值为 14)
    • 表示符号声明。当解析器遇到符号声明时,会触发这个事件。
  • ENTITY_DECLARATION (值为 15)
    • 表示实体声明。当解析器遇到实体声明时,会触发这个事件。

使用示例

以下是一个详细的示例,展示了如何使用 XMLStreamConstantsXMLStreamReader 来解析XML文档。

示例XML文档
<root><element>普通文本</element><element><![CDATA[包含特殊字符 <>&]]></element><comment><!-- 这是一个注释 --></comment><processing><?xml-stylesheet type='text/xsl' href='style.xsl'?></processing>
</root>
示例代码
import javax.xml.stream.*;
import java.io.StringReader;public class XMLStreamReaderExample {public static void main(String[] args) {try {// 示例XML字符串String xmlContent = "<root>"+ "<element>普通文本</element>"+ "<element><![CDATA[包含特殊字符 <>&]]></element>"+ "<comment><!-- 这是一个注释 --></comment>"+ "<processing><?xml-stylesheet type='text/xsl' href='style.xsl'?></processing>"+ "</root>";// 创建XMLInputFactory实例XMLInputFactory factory = XMLInputFactory.newInstance();// 设置特性,确保CDATA节点被正确解析factory.setProperty(XMLInputFactory.IS_COALESCING, false);// 使用StringReader将字符串转换为Reader对象XMLStreamReader reader = factory.createXMLStreamReader(new StringReader(xmlContent));// 遍历XML文档while (reader.hasNext()) {int event = reader.next();switch (event) {case XMLStreamConstants.START_DOCUMENT:System.out.println("Start Document");break;case XMLStreamConstants.END_DOCUMENT:System.out.println("End Document");break;case XMLStreamConstants.START_ELEMENT:System.out.println("Start Element: " + reader.getLocalName());break;case XMLStreamConstants.END_ELEMENT:System.out.println("End Element: " + reader.getLocalName());break;case XMLStreamConstants.CHARACTERS:if (!reader.isWhiteSpace()) {System.out.println("Text: " + reader.getText());}break;case XMLStreamConstants.CDATA:System.out.println("CDATA: " + reader.getText());break;case XMLStreamConstants.COMMENT:System.out.println("Comment: " + reader.getText());break;case XMLStreamConstants.SPACE:System.out.println("Space: " + reader.getText());break;case XMLStreamConstants.PROCESSING_INSTRUCTION:System.out.println("Processing Instruction: " + reader.getText());break;case XMLStreamConstants.ENTITY_REFERENCE:System.out.println("Entity Reference: " + reader.getText());break;case XMLStreamConstants.ENTITY_DECLARATION:System.out.println("Entity Declaration: " + reader.getText());break;case XMLStreamConstants.NOTATION_DECLARATION:System.out.println("Notation Declaration: " + reader.getText());break;case XMLStreamConstants.ATTRIBUTE:System.out.println("Attribute: " + reader.getLocalName() + " = " + reader.getAttributeValue(null, reader.getLocalName()));break;case XMLStreamConstants.NAMESPACE:System.out.println("Namespace: " + reader.getPrefix() + " = " + reader.getNamespaceURI());break;case XMLStreamConstants.DTD:System.out.println("DTD: " + reader.getText());break;}}// 关闭XMLStreamReaderreader.close();} catch (Exception e) {e.printStackTrace();}}
}

输出

运行上述代码后,输出将会是:

Start Document
Start Element: root
Start Element: element
Text: 普通文本
End Element: element
Start Element: element
CDATA: 包含特殊字符 <>&
End Element: element
Start Element: comment
Comment:  这是一个注释 
End Element: comment
Start Element: processing
Processing Instruction: xml-stylesheet type='text/xsl' href='style.xsl'
End Element: processing
End Element: root
End Document

总结

  • XMLStreamConstants 接口定义了XML解析过程中可能出现的各种事件类型。
  • XMLStreamReader 是一个用于读取XML流的接口,结合 XMLStreamConstants 可以方便地解析和处理XML文档。
  • 通过设置解析器的特性(如 IS_COALESCING),可以控制解析行为,确保 CDATA 节点被正确解析。

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

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

相关文章

aspose如何获取PPT放映页“切换”的“持续时间”值

aspose如何获取PPT放映页“切换”的“持续时间”值 项目场景问题描述问题1&#xff1a;从官方文档和资料查阅发现并没有对切换的持续时间进行处理的方法问题2&#xff1a;aspose的依赖包中&#xff0c;所有的关键对象都进行了混淆处理 解决方案1、找到ppt切换的持续时间对应的混…

GIT:如何查找已删除的文件的历史记录

首先你得知道文件的名称和路径 然后打开 gitlab&#xff0c;到项目中&#xff0c;仓库-> 文件 查找文件 复制文件名到可能存在过这个文件的分支当中&#xff0c;就能看到了

自动渗透测试与手动渗透测试

根据《渗透测试中发现的 5 种常见网络安全威胁》报告&#xff0c;渗透测试越来越受欢迎。预计到 2025 年&#xff0c;渗透测试市场规模将达到 45 亿美元。 什么是自动渗透测试&#xff1f; 自动化渗透测试工具可以快速有效地检查系统中是否存在已知的安全问题&#xff0c;即使…

使用elementUI实现表格行拖拽改变顺序,无需引入外部库

前言&#xff1a; 使用vue2element UI&#xff0c;且完全使用原生的拖拽事件,无需引入外部库。 如果表格数据量较大&#xff0c;或需要更多复杂功能&#xff0c;可以考虑使用 vuedraggable库&#xff0c;提供更多配置选项和拖拽功能。 思路&#xff1a; 1. 通过el-table的ro…

WPF Prism框架

Prism 是一个开源框架&#xff0c;专门用于开发可扩展、模块化和可测试的企业级 XAML 应用程序&#xff0c;适用于 WPF&#xff08;Windows Presentation Foundation&#xff09;和 Xamarin Forms 等平台。它基于 MVVM&#xff08;Model-View-ViewModel&#xff09;设计模式&am…

C#开发流程

注&#xff1a;检查数据库链接 设置搜索 1.新建模块文件夹 对应应用 右键-添加-新建文件夹 2.新建类 在新建模块下右键 新建-类&#xff0c;修改类名称 修改internal为public 新建所需字段&#xff0c;注意类型声明及必填设置 [SugarColumn(IsNullable false)]public strin…

区块链应用第1讲:基于区块链的智慧货运平台

基于区块链的智慧货运平台 网络货运平台已经比较成熟&#xff0c;提供了给货源方提供找司机的交易匹配方案&#xff1b;其中包含这几个角色&#xff1a;货主、承运人(司机、车队长)、监管机构、平台。司机要想接单&#xff0c;依赖于多个中心化的第三方平台&#xff0c;且三方平…

计算机毕业设计 | SpringBoot智慧⾼校学术报告系统 AI写作大模型生成平台(附源码)

1&#xff0c;项目介绍 智慧⾼校学术报告系统是⼀个基于 SpringBoot 开发的标准 Java Web 项⽬。系统整体⻚⾯设计简约⼤⽓&#xff0c;巧妙融合了⽬前备受瞩⽬的 AIGC ⽣成式 AI 技术&#xff0c;选择了阿⾥通⽤千问⼤语⾔模型&#xff0c;以智能⽣成趣味报告标题和润⾊报告内…

万字长文解读机器学习——决策树

&#x1f33a;历史文章列表&#x1f33a; 机器学习——损失函数、代价函数、KL散度机器学习——特征工程、正则化、强化学习机器学习——常见算法汇总机器学习——感知机、MLP、SVM机器学习——KNN机器学习——贝叶斯机器学习——决策树机器学习——随机森林、Bagging、Boostin…

在Django中安装、配置、使用CKEditor5,并将CKEditor5录入的文章展现出来,实现一个简单博客网站的功能

在Django中可以使用CKEditor4和CKEditor5两个版本&#xff0c;分别对应软件包django-ckeditor和django-ckeditor-5。原来使用的是CKEditor4&#xff0c;python manager.py makemigrations时总是提示CKEditor4有安全风险&#xff0c;建议升级到CKEditor5。故卸载了CKEditor4&…

实战项目:通过自我学习让AI学习五子棋 - 1 - 项目定义

项目介绍 五子棋是一种博弈游戏。在棋盘上黑子和白子交替落子&#xff0c;先于在任何方向上将至少五个棋子连在一起的一方获胜。在我们这个项目中我们尝试使用自学习的方法训练出一套走五子棋的算法。 这个项目本身并无特别大的实用价值。我们的目的在于&#xff1a; 尝试自…

从0开始搭建一个生产级SpringBoot2.0.X项目(十二)SpringBoot接口SpringSecurity JWT鉴权

前言 最近有个想法想整理一个内容比较完整springboot项目初始化Demo。 SpringBoot接口权限控制 SpringSecurity 接口使用 Bearer token类型 JWT 鉴权 一、pom文件新增依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>s…

JavaEE初阶---properties类+反射+注解

文章目录 1.配置文件properities2.快速上手3.常见方法3.1读取配置文件3.2获取k-v值3.3修改k-v值3.4unicode的说明 4.反射的引入4.1传统写法4.2反射的写法&#xff08;初识&#xff09;4.3反射的介绍4.4获得class类的方法4.5所有类型的class对象4.6类加载过程4.7类初始化的过程4…

【React】深入理解 JSX语法

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解 JSX语法1. JSX 简介2. JSX 的基本语法2.1 基本结构2.2 与普通 JavaScr…

Spark中给读取到的数据 的列 重命名的几种方式!

目录 一、第一种 (withColumnRenamed) 二、第二种&#xff08;toDF&#xff09; 三、第三种&#xff08; toDF(*tuple1) &#xff09; 四、 第四种(schema) 五、假如文件里自带有列名的情况&#xff08;option&#xff09; 一、第一种 (withColumnRenamed) 假设要把如下…

M1M2 MAC安装windows11 虚拟机的全过程

M1/M2 MAC安装windows11 虚拟机的全过程 这两天折腾了一下windows11 arm架构的虚拟机&#xff0c;将途中遇到的坑总结一下。 1、虚拟机软件&#xff1a;vmware fusion 13.6 或者 parallel 19 &#xff1f; 结论是&#xff1a;用parellel 19。 这两个软件都安装过&#xff0…

IEEE JSSC更新|Tiny Tapeout:让每个人都能设计定制芯片

简介 由于成本高昂且需要专业技术&#xff0c;设计和制造定制集成电路的传统上仅限于大型公司和机构。然而&#xff0c;名为Tiny Tapeout的创新项目正在改变这一现状&#xff0c;让业余爱好者、学生和小型团队也能设计定制芯片。本文将探讨Tiny Tapeout的工作原理&#xff0c;以…

Java:一段代码,无限可能

Java&#xff0c;诞生于1995年&#xff0c;如今已走过近三十载春秋。它历经互联网泡沫的兴衰、移动互联网的浪潮&#xff0c;以及云计算和大数据的洗礼&#xff0c;依然屹立在编程语言的舞台中央&#xff0c;散发着耀眼的光芒。这篇文章将带你回顾Java的辉煌历史&#xff0c;探…

《XGBoost算法的原理推导》12-14决策树复杂度的正则化项 公式解析

本文是将文章《XGBoost算法的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 我们定义一颗树的复杂度 Ω Ω Ω&#xff0c;它由两部分组成&#xff1a; 叶子结点的数量&#xff1b;叶子结点权重向量的 L 2 L2 L2范数&#xff1b; 公式(…

Linux【基础篇】

-- 原生罪 linux的入门安装学习 什么是操作系统&#xff1f; 用户通过操作系统和计算机硬件联系使用。桥梁~ 什么是Linux&#xff1f; 他是一套开放源代码&#xff08;在互联网上找到Linux系统的源代码&#xff0c;C语言写出的软件&#xff09;&#xff0c;可以自由 传播&…