【中秋国庆不断更】XML在HarmonyOS中的生成,解析与转换(下)

这篇具有很好参考价值的文章主要介绍了【中秋国庆不断更】XML在HarmonyOS中的生成,解析与转换(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、XML解析

对于以XML作为载体传递的数据,实际使用中需要对相关的节点进行解析,一般包括解析XML标签和标签值、解析XML属性和属性值、解析XML事件类型和元素深度三类场景。

XML模块提供XmlPullParser类对XML文件解析,输入为含有XML文本的ArrayBuffer或DataView,输出为解析得到的信息。

表1 XML解析选项

名称 类型 必填 说明
supportDoctype boolean 是否忽略文档类型。默认为false,表示对文档类型进行解析。
ignoreNameSpace boolean 是否忽略命名空间。默认为false,表示对命名空间进行解析。
tagValueCallbackFunction (name: string, value: string) => boolean 获取tagValue回调函数,打印标签及标签值。默认为null,表示不进行XML标签和标签值的解析。
attributeValueCallbackFunction (name: string, value: string) => boolean 获取attributeValue回调函数, 打印属性及属性值。默认为null,表示不进行XML属性和属性值的解析。
tokenValueCallbackFunction (eventType: EventType, value: ParseInfo) => boolean 获取tokenValue回调函数,打印标签事件类型及parseInfo对应属性。默认为null,表示不进行XML事件类型解析。

注意事项

​ ● XML解析及转换需要确保传入的XML数据符合标准格式。

​ ● XML解析目前不支持按指定节点解析对应的节点值。

解析XML标签和标签值

​ 1. 引入模块。

import xml from '@ohos.xml';
import util from '@ohos.util'; // 需要使用util模块函数对文件编码

2.XML文件编码后调用XmlPullParser。

可以基于ArrayBuffer构造XmlPullParser对象, 也可以基于DataView构造XmlPullParser对象。

let strXml =
  '<?xml version="1.0" encoding="utf-8"?>' +
    '<note importance="high" logged="true">' +
    '<title>Play</title>' +
    '<lens>Work</lens>' +
    '</note>';
let textEncoder = new util.TextEncoder();
let arrBuffer = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码
// 1.基于ArrayBuffer构造XmlPullParser对象
let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');

// 2.基于DataView构造XmlPullParser对象
let dataView = new DataView(arrBuffer.buffer);
let that = new xml.XmlPullParser(dataView, 'UTF-8');

​ 3. 自定义回调函数,本例直接打印出标签及标签值。

let str = '';
function func(name, value){
  str = name + value;
  console.info(str);
  return true; //true:继续解析 false:停止解析
}

​ 4. 设置解析选项,调用parse函数。

let options = {supportDoctype:true, ignoreNameSpace:true, tagValueCallbackFunction:func};
that.parse(options);

输出结果如下所示:

note
title
Play
title
lens
Work
lens
note

解析XML属性和属性值

1.引入模块。

import xml from '@ohos.xml';
import util from '@ohos.util'; // 需要使用util模块函数对文件编码

2.对XML文件编码后调用XmlPullParser。

let strXml =
  '<?xml version="1.0" encoding="utf-8"?>' +
    '<note importance="high" logged="true">' +
    '    <title>Play</title>' +
    '    <title>Happy</title>' +
    '    <lens>Work</lens>' +
    '</note>';
let textEncoder = new util.TextEncoder();
let arrBuffer = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码
let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');


3.自定义回调函数,本例直接打印出属性及属性值。

let str = '';
function func(name, value){
  str += name + ' ' + value + ' ';
  return true; // true:继续解析 false:停止解析
}


4.设置解析选项,调用parse函数。

let options = {supportDoctype:true, ignoreNameSpace:true, attributeValueCallbackFunction:func};
that.parse(options);
console.info(str); // 一次打印出所有的属性及其值

输出结果如下所示:

importance high logged true // note节点的属性及属性值

解析XML事件类型和元素深度

​ 1. 引入模块。

import xml from '@ohos.xml';
import util from '@ohos.util'; // 需要使用util模块函数对文件编码

​ 2. 对XML文件编码后调用XmlPullParser。

let strXml =
  '<?xml version="1.0" encoding="utf-8"?>' +
  '<note importance="high" logged="true">' +
  '<title>Play</title>' +
  '</note>';
let textEncoder = new util.TextEncoder();
let arrBuffer = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码
let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');

​ 3. 自定义回调函数,本例直接打印元素事件类型及元素深度。

let str = '';
function func(name, value){
  str = name + ' ' + value.getDepth(); // getDepth 获取元素的当前深度
  console.info(str)
  return true; //true:继续解析 false:停止解析
}

​ 4. 设置解析选项,调用parse函数。

let options = {supportDoctype:true, ignoreNameSpace:true, tokenValueCallbackFunction:func};
that.parse(options);

输出结果如下所示:

0 0 // 0:<?xml version="1.0" encoding="utf-8"?> 对应事件类型START_DOCUMENT值为0  0:起始深度为0
2 1 // 2:<note importance="high" logged="true"> 对应事件类型START_TAG值为2       1:深度为1
2 2 // 2:<title>对应事件类型START_TAG值为2                                       2:深度为2
4 2 // 4:Play对应事件类型TEXT值为4                                               2:深度为2
3 2 // 3:</title>对应事件类型END_TAG值为3                                        2:深度为2
3 1 // 3:</note>对应事件类型END_TAG值为3                                         1:深度为1(与<note对应>)
1 0 // 1:对应事件类型END_DOCUMENT值为1                                           0:深度为0
场景示例

场景示例

此处以调用所有解析选项为例,提供解析XML标签、属性和事件类型的开发示例。

import xml from '@ohos.xml';
import util from '@ohos.util';

let strXml =
  '<?xml version="1.0" encoding="UTF-8"?>' +
    '<book category="COOKING">' +
    '<title lang="en">Everyday</title>' +
    '<author>Giada</author>' +
    '</book>';
let textEncoder = new util.TextEncoder();
let arrBuffer = textEncoder.encodeInto(strXml);
let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
let str = '';

function tagFunc(name, value) {
  str = name + value;
  console.info('tag-' + str);
  return true;
}

function attFunc(name, value) {
  str = name + ' ' + value;
  console.info('attri-' + str);
  return true;
}

function tokenFunc(name, value) {
  str = name + ' ' + value.getDepth();
  console.info('token-' + str);
  return true;
}

let options = {
  supportDocType: true,
  ignoreNameSpace: true,
  tagValueCallbackFunction: tagFunc,
  attributeValueCallbackFunction: attFunc,
  tokenValueCallbackFunction: tokenFunc
};
that.parse(options);

输出结果如下所示:

tag-
token-0 0
tag-book
attri-category COOKING
token-2 1
tag-title
attri-lang en
token-2 2
tag-Everyday
token-4 2
tag-title
token-3 2
tag-author
token-2 2
tag-Giada
token-4 2
tag-author
token-3 2
tag-book
token-3 1
tag-
token-1 0

二、 XML转换

将XML文本转换为JavaScript对象可以更轻松地处理和操作数据,并且更适合在JavaScript应用程序中使用。

语言基础类库提供ConvertXML类将XML文本转换为JavaScript对象,输入为待转换的XML字符串及转换选项,输出为转换后的JavaScript对象。具体转换选项可见@ohos.convertxml。

注意事项

XML解析及转换需要确保传入的XML数据符合标准格式。

开发步骤

此处以XML转为JavaScript对象后获取其标签值为例,说明转换效果。

​ 1. 引入模块。

import convertxml from '@ohos.convertxml';

​ 2. 输入待转换的XML,设置转换选项。

let xml =
  '<?xml version="1.0" encoding="utf-8"?>' +
    '<note importance="high" logged="true">' +
    '    <title>Happy</title>' +
    '    <todo>Work</todo>' +
    '    <todo>Play</todo>' +
    '</note>';
let options = {
  // 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"
}

​ 3. 调用转换函数,打印结果。

let conv = new convertxml.ConvertXML();
let result = conv.convertToJSObject(xml, options);
let strRes = JSON.stringify(result); // 将js对象转换为json字符串,用于显式输出
console.info(strRes);
// 也可以直接处理转换后的JS对象,获取标签值
let title = result['_elements'][0]['_elements'][0]['_elements'][0]['_text']; // 解析<title>标签对应的值
let todo = result['_elements'][0]['_elements'][1]['_elements'][0]['_text']; // 解析<todo>标签对应的值
let todo2 = result['_elements'][0]['_elements'][2]['_elements'][0]['_text']; // 解析<todo>标签对应的值
console.info(title); // Happy
console.info(todo); // Work
console.info(todo2); // Play

输出结果如下所示:

strRes:
{"_declaration":{"_attributes":{"version":"1.0","encoding":"utf-8"}},"_elements":[{"_type":"element","_name":"note",
 "_attributes":{"importance":"high","logged":"true"},"_elements":[{"_type":"element","_name":"title",
 "_elements":[{"_type":"text","_text":"Happy"}]},{"_type":"element","_name":"todo",
 "_elements":[{"_type":"text","_text":"Work"}]},{"_type":"element","_name":"todo",
 "_elements":[{"_type":"text","_text":"Play"}]}]}]}
title:Happy
todo:Work
todo2:Play

本文由博客一文多发平台 OpenWrite 发布!文章来源地址https://www.toymoban.com/news/detail-710329.html

到了这里,关于【中秋国庆不断更】XML在HarmonyOS中的生成,解析与转换(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【中秋国庆不断更】OpenHarmony定义可动画属性:@AnimatableExtend装饰器

    @AnimatableExtend装饰器用于自定义可动画的属性方法,在这个属性方法中修改组件不可动画的属性。在动画执行过程时,通过逐帧回调函数修改不可动画属性值,让不可动画属性也能实现动画效果。 ​ ● 可动画属性:如果一个属性方法在animation属性前调用,改变这个属性的值

    2024年02月08日
    浏览(39)
  • 【中秋国庆不断更】OpenHarmony组件内状态变量使用:@State装饰器

    @State装饰的变量,或称为状态变量,一旦变量拥有了状态属性,就和自定义组件的渲染绑定起来。当状态改变时,UI会发生对应的渲染改变。 在状态变量相关装饰器中,@State是最基础的,使变量拥有状态属性的装饰器,它也是大部分状态变量的数据源。 说明: 从API version 9开

    2024年02月08日
    浏览(44)
  • 国庆中秋特辑(五)MySQL如何性能调优?下篇

    国庆中秋特辑系列文章: 国庆中秋特辑(八)Spring Boot项目如何使用JPA 国庆中秋特辑(七)Java软件工程师常见20道编程面试题 国庆中秋特辑(六)大学生常见30道宝藏编程面试题 国庆中秋特辑(五)MySQL如何性能调优?下篇 国庆中秋特辑(四)MySQL如何性能调优?上篇 国庆

    2024年02月08日
    浏览(39)
  • 国庆中秋特辑(四)MySQL如何性能调优?上篇

    国庆中秋特辑系列文章: 国庆中秋特辑(八)Spring Boot项目如何使用JPA 国庆中秋特辑(七)Java软件工程师常见20道编程面试题 国庆中秋特辑(六)大学生常见30道宝藏编程面试题 国庆中秋特辑(五)MySQL如何性能调优?下篇 国庆中秋特辑(四)MySQL如何性能调优?上篇 国庆

    2024年02月08日
    浏览(46)
  • 国庆中秋特辑(八)Spring Boot项目如何使用JPA

    国庆中秋特辑系列文章: 国庆中秋特辑(八)Spring Boot项目如何使用JPA 国庆中秋特辑(七)Java软件工程师常见20道编程面试题 国庆中秋特辑(六)大学生常见30道宝藏编程面试题 国庆中秋特辑(五)MySQL如何性能调优?下篇 国庆中秋特辑(四)MySQL如何性能调优?上篇 国庆

    2024年02月08日
    浏览(55)
  • 编码技巧:如何在Golang中高效解析和生成XML

    在当今数据驱动的编程世界中,有效地处理各种数据格式是每个开发人员必备的技能之一。其中,XML(可扩展标记语言)作为一种广泛使用的标记语言,它的灵活性和可扩展性使其在配置文件、网络服务以及跨平台数据交换中占据重要地位。然而,对于刚接触Golang的开发者来

    2024年01月16日
    浏览(39)
  • java请求SAP系统,发起soap的xml报文,实体类转换,idea自动生成教程

    1、将接口的网页地址,右键保存,然后修改文件后缀为wsdl文件 2、idea全局搜索 wsdl,找到自动转换javabean插件: 3、点击后,选择下载改完后缀的文件(选择):      4、将无用的class文件删除掉 5、请求sap的地址为:最下边有两个地址,http和https的,请求地址为http的,后缀改一

    2024年02月12日
    浏览(38)
  • HarmonyOS云开发基础认证考试满分答案(100分)【全网最全-不断更新】

    系列文章: HarmonyOS应用开发者基础认证满分答案(100分) HarmonyOS应用开发者基础认证【闯关习题 满分答案】 HarmonyOS应用开发者高级认证满分答案(100分) HarmonyOS云开发基础认证满分答案(100分) PC端可直接搜索 快捷键: Ctrl+F 题目特有、技术等等 如有

    2024年02月04日
    浏览(106)
  • 新版IDEA无法解析Maven项目中的pom.xml文件

    在使用新版IDEA进行Maven项目开发时,有时会遇到无法解析pom.xml文件的问题。这可能导致项目无法构建或无法正常导入相关依赖。本文将介绍一些可能的原因和解决方案,帮助您解决这个问题。 检查Maven配置: 首先,确保您的IDEA正确配置了Maven。在IDEA的设置中,通过以下步骤

    2024年02月03日
    浏览(68)
  • HarmonyOS应用开发者基础认证考试满分答案(100分)【全网最全-不断更新】

    系列文章: HarmonyOS应用开发者基础认证满分答案(100分) HarmonyOS应用开发者基础认证【闯关习题 满分答案】 HarmonyOS应用开发者高级认证满分答案(100分) HarmonyOS云开发基础认证满分答案(100分) PC端可直接搜索 快捷键: Ctrl+F 题目特有、技术等等 如有

    2024年01月16日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包