鸿蒙开发——使用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 的正整数。要求全部储存在数组中,去除掉不是质数的数字,依次输出剩余的质数。 输入格式 第一行输入一个正整数 𝑛,表示整数个数。 第二行输入 𝑛 个正整数 𝑎…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
