• 【中秋国庆不断更】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. 引入模块。
    1. import xml from '@ohos.xml';
    2. import util from '@ohos.util'// 需要使用util模块函数对文件编码

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

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

    1. let strXml =
    2.   '' +
    3.     '' +
    4.     'Play' +
    5.     'Work' +
    6.     '';
    7. let textEncoder = new util.TextEncoder();
    8. let arrBuffer = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码
    9. // 1.基于ArrayBuffer构造XmlPullParser对象
    10. let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
    11. // 2.基于DataView构造XmlPullParser对象
    12. let dataView = new DataView(arrBuffer.buffer);
    13. let that = new xml.XmlPullParser(dataView, 'UTF-8');

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

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

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

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

    输出结果如下所示:

    1. note
    2. title
    3. Play
    4. title
    5. lens
    6. Work
    7. lens
    8. note

    解析XML属性和属性值

    1.引入模块。

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

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

    1. let strXml =
    2. '"1.0" encoding="utf-8"?>' +
    3. '<note importance="high" logged="true">' +
    4. '    <title>Playtitle>' +
    5. '    <title>Happytitle>' +
    6. '    <lens>Worklens>' +
    7. 'note>';
    8. let textEncoder = new util.TextEncoder();
    9. let arrBuffer = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码
    10. let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');

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

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

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

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

    输出结果如下所示:

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

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

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

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

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

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

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

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

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

    输出结果如下所示:

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

    场景示例

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

    1. import xml from '@ohos.xml';
    2. import util from '@ohos.util';
    3. let strXml =
    4. '' +
    5. '' +
    6. 'Everyday' +
    7. 'Giada' +
    8. '';
    9. let textEncoder = new util.TextEncoder();
    10. let arrBuffer = textEncoder.encodeInto(strXml);
    11. let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
    12. let str = '';
    13. function tagFunc(name, value) {
    14.   str = name + value;
    15.   console.info('tag-' + str);
    16. return true;
    17. }
    18. function attFunc(name, value) {
    19.   str = name + ' ' + value;
    20.   console.info('attri-' + str);
    21. return true;
    22. }
    23. function tokenFunc(name, value) {
    24.   str = name + ' ' + value.getDepth();
    25.   console.info('token-' + str);
    26. return true;
    27. }
    28. let options = {
    29.   supportDocType: true,
    30.   ignoreNameSpace: true,
    31.   tagValueCallbackFunction: tagFunc,
    32.   attributeValueCallbackFunction: attFunc,
    33.   tokenValueCallbackFunction: tokenFunc
    34. };
    35. that.parse(options);

    输出结果如下所示:

    1. tag-
    2. token-0 0
    3. tag-book
    4. attri-category COOKING
    5. token-2 1
    6. tag-title
    7. attri-lang en
    8. token-2 2
    9. tag-Everyday
    10. token-4 2
    11. tag-title
    12. token-3 2
    13. tag-author
    14. token-2 2
    15. tag-Giada
    16. token-4 2
    17. tag-author
    18. token-3 2
    19. tag-book
    20. token-3 1
    21. tag-
    22. 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,设置转换选项。

    1. let xml =
    2. '' +
    3. '' +
    4. '    Happy' +
    5. '    Work' +
    6. '    Play' +
    7. '';
    8. let options = {
    9. // trim: false 转换后是否删除文本前后的空格,否
    10. // declarationKey: "_declaration" 转换后文件声明使用_declaration来标识
    11. // instructionKey: "_instruction" 转换后指令使用_instruction标识
    12. // attributesKey: "_attributes" 转换后属性使用_attributes标识
    13. // textKey: "_text" 转换后标签值使用_text标识
    14. // cdataKey: "_cdata" 转换后未解析数据使用_cdata标识
    15. // docTypeKey: "_doctype" 转换后文档类型使用_doctype标识
    16. // commentKey: "_comment" 转换后注释使用_comment标识
    17. // parentKey: "_parent" 转换后父类使用_parent标识
    18. // typeKey: "_type" 转换后元素类型使用_type标识
    19. // nameKey: "_name" 转换后标签名称使用_name标识
    20. // elementsKey: "_elements" 转换后元素使用_elements标识
    21.   trim: false,
    22.   declarationKey: "_declaration",
    23.   instructionKey: "_instruction",
    24.   attributesKey: "_attributes",
    25.   textKey: "_text",
    26.   cdataKey: "_cdata",
    27.   docTypeKey: "_doctype",
    28.   commentKey: "_comment",
    29.   parentKey: "_parent",
    30.   typeKey: "_type",
    31.   nameKey: "_name",
    32.   elementsKey: "_elements"
    33. }

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

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

    输出结果如下所示:

    1. strRes:
    2. {"_declaration":{"_attributes":{"version":"1.0","encoding":"utf-8"}},"_elements":[{"_type":"element","_name":"note",
    3. "_attributes":{"importance":"high","logged":"true"},"_elements":[{"_type":"element","_name":"title",
    4. "_elements":[{"_type":"text","_text":"Happy"}]},{"_type":"element","_name":"todo",
    5. "_elements":[{"_type":"text","_text":"Work"}]},{"_type":"element","_name":"todo",
    6. "_elements":[{"_type":"text","_text":"Play"}]}]}]}
    7. title:Happy
    8. todo:Work
    9. todo2:Play

  • 相关阅读:
    20221130如何修改OBS录屏的存储路径?
    鸿蒙HarmonyOS实战-ArkUI动画(页面转场动画)
    Webpack Chunk 分包规则
    回归算法的评估指标
    利用kubeadmin快速搭建kubenates集群
    pytest接口自动化测试框架 | 为什么要做pytest插件的二次开发
    12-Vue技术栈之Vuex的使用
    基于盛科芯片的PTP功能总结
    python全局和局部变量以及引用和装饰器
    quinn源码解析:QUIC数据包是如何发送的
  • 原文地址:https://blog.csdn.net/HarmonyOSDev/article/details/133312798