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

打印 上一主题 下一主题

主题 892|帖子 892|积分 2676

一、XML解析

对于以XML作为载体传递的数据,实际使用中需要对相关的节点进行解析,一般包括解析XML标签和标签值解析XML属性和属性值解析XML事件类型和元素深度三类场景。
XML模块提供XmlPullParser类对XML文件解析,输入为含有XML文本的ArrayBuffer或DataView,输出为解析得到的信息。
表1 XML解析选项
名称类型必填说明supportDoctypeboolean否是否忽略文档类型。默认为false,表示对文档类型进行解析。ignoreNameSpaceboolean否是否忽略命名空间。默认为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.   '<?xml version="1.0" encoding="utf-8"?>' +
  3.     '<note importance="high" logged="true">' +
  4.     '<title>Play</title>' +
  5.     '<lens>Work</lens>' +
  6.     '</note>';
  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.   '<?xml version="1.0" encoding="utf-8"?>' +
  3.     '<note importance="high" logged="true">' +
  4.     '    <title>Play</title>' +
  5.     '    <title>Happy</title>' +
  6.     '    <lens>Work</lens>' +
  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); // 一次打印出所有的属性及其值
复制代码
输出结果如下所示:
  1. 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.   '<?xml version="1.0" encoding="utf-8"?>' +
  3.   '<note importance="high" logged="true">' +
  4.   '<title>Play</title>' +
  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.   '<?xml version="1.0" encoding="UTF-8"?>' +
  5.     '<book category="COOKING">' +
  6.     '<title lang="en">Everyday</title>' +
  7.     '<author>Giada</author>' +
  8.     '</book>';
  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.     引入模块。
  1. import convertxml from '@ohos.convertxml';
复制代码
​            2.     输入待转换的XML,设置转换选项。
  1. let xml =
  2.   '<?xml version="1.0" encoding="utf-8"?>' +
  3.     '<note importance="high" logged="true">' +
  4.     '    <title>Happy</title>' +
  5.     '    <todo>Work</todo>' +
  6.     '    <todo>Play</todo>' +
  7.     '</note>';
  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
复制代码
本文由博客一文多发平台 OpenWrite 发布!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表