鸿蒙开发——使用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 的正整数。要求全部储存在数组中,去除掉不是质数的数字,依次输出剩余的质数。 输入格式 第一行输入一个正整数 𝑛,表示整数个数。 第二行输入 𝑛 个正整数 𝑎…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
