鸿蒙开发——使用ArkTs处理XML文本
1、概 述
XML(可扩展标记语言)是一种用于描述数据的标记语言,旨在提供一种通用的方式来传输和存储数据,特别是Web应用程序中经常使用的数据。XML并不预定义标记。因此,XML更加灵活,并且可以适用于广泛的应用领域。
XML文档由元素(element)、属性(attribute)和内容(content)组成。
-
-
内容则是元素包含的数据或子元素。
-
属性提供了有关元素的其他信息。
-
元素指的是标记对,包含文本、属性或其他元素。
-
XML还可以通过使用XML Schema或DTD(文档类型定义)来定义文档结构。这些机制允许开发人员创建自定义规则以验证XML文档是否符合其预期的格式。
XML还支持命名空间、实体引用、注释、处理指令等特性,使其能够灵活地适应各种数据需求。
语言基础类库提供了XML相关的基础能力,包括:XML的生成、XML的解析和XML的转换。
2、生成XML
一个生成XML的示例如下(关注 9 ~ 41行,genXml方法):
import { xml, util } from '@kit.ArkTS';@Entry@Component@Previewstruct Index {@State result: string = '';genXml() {// 方式1:基于Arraybuffer构造XmlSerializer对象let arrayBuffer: ArrayBuffer = new ArrayBuffer(2048); // 创建一个2048字节的缓冲区let thatSer: xml.XmlSerializer = new xml.XmlSerializer(arrayBuffer); // 基于Arraybuffer构造XmlSerializer对象// 方式2:基于DataView构造XmlSerializer对象// let arrayBuffer: ArrayBuffer = new ArrayBuffer(2048);// let dataView: DataView = new DataView(arrayBuffer);// let thatSer: xml.XmlSerializer = new xml.XmlSerializer(dataView);thatSer.setDeclaration(); // 写入xml的声明thatSer.startElement('bookstore'); // 写入元素开始标记thatSer.startElement('book'); // 嵌套元素开始标记thatSer.setAttributes('category', 'COOKING'); // 写入属性及属性值thatSer.startElement('title');thatSer.setAttributes('lang', 'en');thatSer.setText('Everyday'); // 写入标签值thatSer.endElement(); // 写入结束标记thatSer.startElement('author');thatSer.setText('Giana');thatSer.endElement();thatSer.startElement('year');thatSer.setText('2005');thatSer.endElement();thatSer.endElement();thatSer.endElement();let view: Uint8Array = new Uint8Array(arrayBuffer); // 使用Uint8Array读取arrayBuffer的数据let textDecoder: util.TextDecoder = util.TextDecoder.create(); // 调用util模块的TextDecoder类let res: string = textDecoder.decodeToString(view); // 对view解码// res输出结果this.result = res;}build() {Column() {Row() {Button('生成XML').onClick(() => {this.genXml();}).width('100%')}.width('100%')Row() {Text(this.result).width('100%').padding(10).borderColor(Color.Gray).borderWidth(1)}.width('100%')}.height('100%')}}
效果如下:

3、解析XML
对于XML的解析,一般包括
-
解析XML标签和标签值;
-
解析XML属性和属性值
-
解析XML事件类型和元素深度。
XML模块提供XmlPullParser类对XML文件解析,输入为含有XML文本的ArrayBuffer或DataView,输出为解析得到的信息。
下面分别针对这三种情况做示例讨论。
👉🏻 解析标签与标签内的值
一个解析XML标签和标签值的Demo如下(关注 9 ~ 36行,parseXML方法):
import { xml, util } from '@kit.ArkTS';@Entry@Component@Previewstruct Index {@State result: string = '';parseXml() {// xml案例let strXml: string ='<?xml version="1.0" encoding="utf-8"?>' +'<note importance="high" logged="true">' +'<title>Play</title>' +'<lens>Work</lens>' +'</note>';let textEncoder: util.TextEncoder = new util.TextEncoder();let arrBuffer: Uint8Array = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码// 方式1:基于ArrayBuffer构造XmlPullParser对象let that: xml.XmlPullParser = new xml.XmlPullParser(arrBuffer.buffer as object as ArrayBuffer, 'UTF-8');// 方式2:基于DataView构造XmlPullParser对象// let dataView: DataView = new DataView(arrBuffer.buffer as object as ArrayBuffer);// let that: xml.XmlPullParser = new xml.XmlPullParser(dataView, 'UTF-8');let str: string = '';// 自定义回调函数,本例直接打印出标签及标签值。const func = (name: string, value: string): boolean => {str = name + value + '\n';this.result += str;return true; //true:继续解析 false:停止解析}let options: xml.ParseOptions = {supportDoctype:true, ignoreNameSpace:true, tagValueCallbackFunction:func};that.parse(options);}build() {Column() {Row() {Button('解析XML').onClick(() => {this.parseXml();}).width('100%')}.width('100%')Row() {Text(this.result).width('100%').padding(10).borderColor(Color.Gray).borderWidth(1)}.width('100%')}.height('100%')}}
效果如下:

👉🏻 解析XML属性与属性值
一个解析XML属性和属性值的Demo如下(关注 9 ~ 30行,parseXML方法):
import { xml, util } from '@kit.ArkTS';@Entry@Component@Previewstruct Index {@State result: string = '';parseXml() {let strXml: string ='<?xml version="1.0" encoding="utf-8"?>' +'<note importance="high" logged="true">' +' <title>Play</title>' +' <title>Happy</title>' +' <lens>Work</lens>' +'</note>';let textEncoder: util.TextEncoder = new util.TextEncoder();let arrBuffer: Uint8Array = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码let that: xml.XmlPullParser = new xml.XmlPullParser(arrBuffer.buffer as object as ArrayBuffer, 'UTF-8');let str: string = '';const func = (name: string, value: string): boolean => {str += name + ' ' + value + ' \n';return true; // true:继续解析 false:停止解析}let options: xml.ParseOptions = {supportDoctype:true, ignoreNameSpace:true, attributeValueCallbackFunction:func};that.parse(options);this.result = str; // 一次打印出所有的属性及其值}build() {Column() {Row() {Button('解析XML').onClick(() => {this.parseXml();}).width('100%')}.width('100%')Row() {Text(this.result).width('100%').padding(10).borderColor(Color.Gray).borderWidth(1)}.width('100%')}.height('100%')}}
效果如下:

👉🏻 解析XML事件类型和元素深度
一个解析XML事件类型和元素深度的Demo如下(关注 9 ~ 30行,parseXML方法):
import { xml, util } from '@kit.ArkTS';@Entry@Component@Previewstruct Index {@State result: string = '';parseXml() {let strXml: string ='<?xml version="1.0" encoding="utf-8"?>' +'<note importance="high" logged="true">' +'<title>Play</title>' +'</note>';let textEncoder: util.TextEncoder = new util.TextEncoder();let arrBuffer: Uint8Array = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码let that: xml.XmlPullParser = new xml.XmlPullParser(arrBuffer.buffer as object as ArrayBuffer, 'UTF-8');let str: string = '';const func = (name: xml.EventType, value: xml.ParseInfo): boolean => {str = name + ' ' + value.getDepth() + '\n'; // getDepth 获取元素的当前深度this.result += str;return true; //true:继续解析 false:停止解析}let options: xml.ParseOptions = {supportDoctype:true, ignoreNameSpace:true, tokenValueCallbackFunction:func};that.parse(options);}build() {Column() {Row() {Button('解析XML').onClick(() => {this.parseXml();}).width('100%')}.width('100%')Row() {Text(this.result).width('100%').padding(10).borderColor(Color.Gray).borderWidth(1)}.width('100%')}.height('100%')}}
效果如下:

其中对输出结果解释如下:
0 0 // 0:<?xml version="1.0" encoding="utf-8"?> 对应事件类型 START_DOCUMENT值为0 0:起始深度为02 1 // 2:<note importance="high" logged="true"> 对应事件类型START_TAG值为2 1:深度为12 2 // 2:<title>对应事件类型START_TAG值为2 2:深度为24 2 // 4:Play对应事件类型TEXT值为4 2:深度为23 2 // 3:</title>对应事件类型END_TAG值为3 2:深度为23 1 // 3:</note>对应事件类型END_TAG值为3 1:深度为1(与<note对应>)1 0 // 1:对应事件类型END_DOCUMENT值为1 0:深度为0
【 解析选项参数 】
通过上面三个例子,我们可以观察到,核心都涉及到xml.ParseOptions选项参数。通过这个参数,我们可以设置对应的回调函数和一些解析行为。ParseOptions参数总结如下:
| 名称 | 类型 | 说明 |
| supportDoctype | boolean | 是否解析文档类型,默认false,表示不解析。 |
| ignoreNameSpace | boolean | 是否忽略命名空间,默认false,表示不忽略。 |
| tagValueCallbackFunction | (name: string, value: string) => boolean | 解析开始标签、标签值和结束标签,默认undefined,表示不解析。 |
| attributeValueCallbackFunction | (name: string, value: string) => boolean | 解析属性和属性值,默认undefined,表示不解析。 |
| tokenValueCallbackFunction | (eventType: EventType, value: ParseInfo) => boolean | 解析元素事件类型(EventType)和ParseInfo属性,默认undefined,表示不解析。 |
其中EventType是事件类型枚举,定义如下:
| 名称 | 值 | 说明 |
| START_DOCUMENT | 0 | 启动文件事件。 |
| END_DOCUMENT | 1 | 结束文件事件。 |
| START_TAG | 2 | 启动标签事件。 |
| END_TAG | 3 | 结束标签事件。 |
| TEXT | 4 | 文本事件。 |
| CDSECT | 5 | CDATA事件。 |
| COMMENT | 6 | XML注释事件。 |
| DOCDECL | 7 | XML文档类型声明事件。 |
| INSTRUCTION | 8 | XML处理指令声明事件。 |
| ENTITY_REFERENCE | 9 | 实体引用事件。 |
| WHITESPACE | 10 | 空白事件。 |
4、转换XML为JSON对象
将XML文本转换为JSON对象可以更轻松地处理和操作数据,并且更适合在JS应用程序中使用。
语言基础类库提供ConvertXML类将XML文本转换为JSON对象,输入为待转换的XML字符串及转换选项,输出为转换后的JSON对象。
一个转换示例如下:
import { convertxml } from '@kit.ArkTS';@Entry@Component@Previewstruct Index {@State result: string = '';convertXML() {let xml: string ='<?xml version="1.0" encoding="utf-8"?>' +'<note importance="high" logged="true">' +' <title>Happy</title>' +' <todo>Work</todo>' +' <todo>Play</todo>' +'</note>';let options: convertxml.ConvertOptions = {// trim: false 转换后是否删除文本前后的空格,否// declarationKey: "_declaration" 转换后文件声明使用_declaration来标识// instructionKey: "_instruction" 转换后指令使用_instruction标识// attributesKey: "_attributes" 转换后属性使用_attributes标识// textKey: "_text" 转换后标签值使用_text标识// cdataKey: "_cdata" 转换后未解析数据使用_cdata标识// docTypeKey: "_doctype" 转换后文档类型使用_doctype标识// commentKey: "_comment" 转换后注释使用_comment标识// parentKey: "_parent" 转换后父类使用_parent标识// typeKey: "_type" 转换后元素类型使用_type标识// nameKey: "_name" 转换后标签名称使用_name标识// elementsKey: "_elements" 转换后元素使用_elements标识trim: false,declarationKey: "_declaration",instructionKey: "_instruction",attributesKey: "_attributes",textKey: "_text",cdataKey: "_cdata",doctypeKey: "_doctype",commentKey: "_comment",parentKey: "_parent",typeKey: "_type",nameKey: "_name",elementsKey: "_elements"}let conv: convertxml.ConvertXML = new convertxml.ConvertXML();let result: object = conv.convertToJSObject(xml, options);let strRes: string = JSON.stringify(result); // 将js对象转换为json字符串,用于显式输出console.info(strRes);this.result = strRes;}build() {Column() {Row() {Button('解析XML').onClick(() => {this.convertXML();}).width('100%')}.width('100%')Row() {Text(this.result).width('100%').padding(10).borderColor(Color.Gray).borderWidth(1)}.width('100%')}.height('100%')}}
效果如下:

相关文章:
鸿蒙开发——使用ArkTs处理XML文本
1、概 述 XML(可扩展标记语言)是一种用于描述数据的标记语言,旨在提供一种通用的方式来传输和存储数据,特别是Web应用程序中经常使用的数据。XML并不预定义标记。因此,XML更加灵活,并且可以适用于广泛的应…...
【Linux】文件查找 find grep
文章目录 1. 引言简介Linux文件系统的基本概念为什么文件查找命令在日常使用中非常重要 2. find 命令基本用法常见选项和参数高级用法和技巧实际示例 3. locate 命令如何工作与find命令的区别安装和使用locate实际示例 4. grep 结合文件查找使用grep进行内容查找结合find命令使…...
Go学习笔记之运算符号
算数运算符 运算符描述相加-相减*相乘/相除%求余自增–自减 代码示例: package mainimport "fmt"func main() {// 算数运算符a : 1b : 2fmt.Println(a b) // 加 3fmt.Println(a - b) // 减 -1fmt.Println(a * b) // 乘 2fmt.Println(a / b) // 除 0fm…...
npm : 无法加载文件 D:\nodejs\npm.ps1,因为在此系统上禁止运行脚本
要以管理员身份打开PowerShell,请按照以下步骤操作: 在Windows搜索框中查找PowerShell: 在任务栏上,点击左下角的Windows徽标(或按Win S键)以打开搜索框。输入“PowerShell”以查找PowerShell应用程序。右…...
YOLOv8-ultralytics-8.2.103部分代码阅读笔记-torch_utils.py
torch_utils.py ultralytics\utils\torch_utils.py 目录 torch_utils.py 1.所需的库和模块 2.def torch_distributed_zero_first(local_rank: int): 3.def smart_inference_mode(): 4.def autocast(enabled: bool, device: str "cuda"): 5.def get_cpu_i…...
Java中的数据存储结构解析与应用
一、引言 在Java编程中,数据存储结构是程序设计的基础。合理选择和使用数据结构可以提高程序的性能和可维护性。本文将带您了解Java中的各种数据存储结构,并探讨其优缺点及适用场景。 二、基本数据类型 Java提供了8种基本数据类型,分别是b…...
【链表】力扣 141. 环形链表
一、题目 二、思路 龟兔进行赛跑 龟的速度是 1,兔的速度是 2龟兔从同一起点出发,若 龟追上兔 则说明 有环 存在;若追不上,则说明无环。 三、代码 /*** Definition for singly-linked list.* class ListNode {* int val;* …...
Hbase整合Mapreduce案例2 hbase数据下载至hdfs中——wordcount
目录 整合结构准备数据下载pom.xmlMain.javaReduce.javaMap.java操作 总结 整合结构 和案例1的结构差不多,Hbase移动到开头,后面跟随MR程序。 因此对于输入的K1 V1会进行一定的修改 准备 在HBASE中创建表,并写入数据 create "wunaii…...
diff算法
vue的diff算法详解 vue: diff 算法是一种通过同层的树节点进行比较的高效算法 其有两个特点: 比较只会在同层级进行, 不会跨层级比较 在diff比较的过程中,循环从两边向中间比较 diff 算法在很多场景下都有应用,在 vue 中&…...
最新AI问答创作运营系统(SparkAi系统),GPT-4.0/GPT-4o多模态模型+联网搜索提问+问答分析+AI绘画+管理后台系统
目录 一、人工智能 系统介绍文档 二、功能模块介绍 系统快速体验 三、系统功能模块 3.1 AI全模型支持/插件系统 AI大模型 多模态模型文档分析 多模态识图理解能力 联网搜索回复总结 3.2 AI智能体应用 3.2.1 AI智能体/GPTs商店 3.2.2 AI智能体/GPTs工作台 3.2.3 自…...
docker应用
docker version docker info docker images# 查看主机所以镜像 docker search# 搜索镜像 docker pull# 下载镜像 docker rmi# 删除镜像 docker tag 镜像名:版本 新镜像名:版本 # 复制镜像并改名 docker commit # 提交镜像 docker load -i /XXX/XXX.tar # 导入镜像 docker sav…...
COCO数据集理解
COCO(Common Objects in Context)数据集是一个用于计算机视觉研究的广泛使用的数据集,特别是在物体检测、分割和图像标注等任务中。COCO数据集由微软研究院开发,其主要特点包括: 丰富的标签:COCO数据集包含…...
C# 向上取整多种实现方法
1.使用 Math.Ceiling 方法: 在 C# 中,可以利用 System.Math 类下的 Math.Ceiling 方法来实现向上取整。它接受一个 double 或 decimal 类型的参数,并返回大于或等于该参数的最小整数(以 double 或 decimal 类型表示)。…...
Elastic Cloud Serverless:深入探讨大规模自动扩展和性能压力测试
作者:来自 Elastic David Brimley, Jason Bryan, Gareth Ellis 及 Stewart Miles 深入了解 Elasticsearch Cloud Serverless 如何动态扩展以处理海量数据和复杂查询。我们探索其在实际条件下的性能,深入了解其可靠性、效率和可扩展性。 简介 Elastic Cl…...
新一代零样本无训练目标检测
🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年12月2日21点02分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅h…...
es 3期 第13节-多条件组合查询实战运用
#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性ÿ…...
全局token验证
全局token验证 简介 通俗地说,JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用…...
实时美颜技术详解:美颜SDK与直播APP开发实践
通过集成美颜SDK(软件开发工具包),开发者能够轻松为直播APP提供实时美颜效果,改善用户的直播体验。本篇文章,小编将深入探讨实时美颜技术,重点分析美颜SDK的核心技术及其在直播APP中的应用实践。 一、实时…...
电子应用设计方案-41:智能微波炉系统方案设计
智能微波炉系统方案设计 一、引言 随着科技的不断进步,人们对于厨房电器的智能化需求日益增长。智能微波炉作为现代厨房中的重要设备,应具备更便捷、高效、个性化的功能,以满足用户多样化的烹饪需求。 二、系统概述 1. 系统目标 - 提供精确…...
P5736 【深基7.例2】质数筛
题目描述 输入 𝑛个不大于 105 的正整数。要求全部储存在数组中,去除掉不是质数的数字,依次输出剩余的质数。 输入格式 第一行输入一个正整数 𝑛,表示整数个数。 第二行输入 𝑛 个正整数 𝑎…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
