首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

鸿蒙HarmonyOS实战-ArkTS语言基础类库(XML)

  • 25-02-22 03:20
  • 2931
  • 7394
blog.csdn.net

 前言

数据传输的数据格式有以下几种常见的格式:

  • JSON(JavaScript Object Notation):JSON是一种轻量级的数据交换格式,可读性高且易于解析。它使用键值对的方式表示数据,并且支持多层嵌套。

  • XML(eXtensible Markup Language):XML是一种标记语言,可用于存储和传输结构化数据。它使用标签来定义数据和数据之间的关系。

  • Form Data(表单数据):表单数据是一种常见的数据传输格式,通过HTTP请求中的表单提交进行数据传输,数据以键值对的形式存在。

一、XML

1.概述

XML是可扩展标记语言(eXtensible Markup Language)的缩写。它是一种用于表示和传输结构化数据的标记语言。XML使用自定义的标签来标记数据的各个部分,并使用起始标签和结束标签将数据包裹起来。这种结构化的格式使得数据可以被解析和处理,从而更好地进行数据交换和存储。

与HTML类似,XML也使用尖括号(< >)来定义标签。但与HTML不同,XML标签是自定义的,可以根据需要创建新的标签。XML还支持属性,可以在标签中添加额外的信息。XML数据可以通过解析器解析为可用的对象,如树状结构或文档对象模型(DOM),从而进行进一步的处理和操作。

XML被广泛应用于数据存储、数据交换和Web服务等领域。它是一种通用的、可扩展的标记语言,可以适应不同的数据结构和应用需求。

2.组成

XML文档是由元素、属性和内容组成的。以下是它们的详细解释:

  1. 元素(element):XML文档的基本构建块,也是文档的结构和数据的组织单元。元素由开始标签和结束标签组成,两者之间包含了元素的内容。例如:
  1. <book>
  2. <title>XML for Beginners</title>
  3. <author>John Doe</author>
  4. </book>

、</code>和<code><author></code>都是元素。</p> <ol><li>属性(attribute):元素的附加信息,以名称-值对的形式出现在开始标签中。属性提供有关元素的额外信息。例如:</li></ol> <pre data-index="1" class="set-code-show" name="code"><code class="hljs language-cobol"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-operator"><</span>book category<span class="hljs-operator">=</span><span class="hljs-string">"fiction"</span><span class="hljs-operator">></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-operator"><</span>title<span class="hljs-operator">></span>XML <span class="hljs-keyword">for</span> Beginners<span class="hljs-operator"><</span><span class="hljs-operator">/</span>title<span class="hljs-operator">></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-operator"><</span>author<span class="hljs-operator">></span>John Doe<span class="hljs-operator"><</span><span class="hljs-operator">/</span>author<span class="hljs-operator">></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-operator"><</span><span class="hljs-operator">/</span>book<span class="hljs-operator">></span></div></div></li></ol></code><div class="hljs-button signin active" data-title="登录复制" data-report-click='{"spm":"1001.2101.3001.4334"}' onclick="hljs.signin(event)"></div></pre> <p><code>category</code>是<code>book</code>元素的属性,其值为<code>fiction</code>。</p> <ol><li>内容(content):元素中的文本或其他元素。在元素的开始标签和结束标签之间可以包含文本或其他元素。例如:</li></ol> <pre data-index="2" class="set-code-show" name="code"><code class="hljs language-cobol"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-operator"><</span>book<span class="hljs-operator">></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-operator"><</span>title<span class="hljs-operator">></span>XML <span class="hljs-keyword">for</span> Beginners<span class="hljs-operator"><</span><span class="hljs-operator">/</span>title<span class="hljs-operator">></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-operator"><</span>author<span class="hljs-operator">></span>John Doe<span class="hljs-operator"><</span><span class="hljs-operator">/</span>author<span class="hljs-operator">></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-operator"><</span><span class="hljs-operator">/</span>book<span class="hljs-operator">></span></div></div></li></ol></code><div class="hljs-button signin active" data-title="登录复制" data-report-click='{"spm":"1001.2101.3001.4334"}' onclick="hljs.signin(event)"></div></pre> <p><code><title>XML for Beginners和John Doe是book元素的内容。

3.文档结构定义形式

?3.1 XML Schema

在XML中使用XML Schema定义结构的方式是使用一个独立的XML Schema文件,该文件定义了你希望XML文档符合的结构规范。

首先,创建一个XML Schema文件,例如"example.xsd"。在该文件中定义你的元素、属性和数据类型。以下是一个示例XML Schema文件的基本结构:

  1. "1.0" encoding="UTF-8"?>
  2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  3. xs:schema>

接下来,在你的XML文档中引用该XML Schema文件,以使XML文档与定义的结构匹配。为此,在XML文档的根元素上添加一个xmlns:xsi属性和xsi:schemaLocation属性。xmlns:xsi属性指定XML命名空间xsi的定义,xsi:schemaLocation属性指定XML Schema文件的位置。

下面是一个示例XML文档的基本结构,引用了上述的XML Schema文件:

  1. "1.0" encoding="UTF-8"?>
  2. <rootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://www.example.com example.xsd">
  4. rootElement>

xmlns:xsi属性定义了xsi命名空间,并指定了其定义的位置。xsi:schemaLocation属性指定了XML Schema文件的位置,其中"http://www.example.com"是XML命名空间的URI,"example.xsd"是XML Schema文件的位置。

该XML文档的结构和内容应符合在XML Schema文件中定义的规范。如果XML文档与XML Schema不匹配,解析器将会报告错误。

?3.2 DTD

DTD(Document Type Definition)是一种用来定义XML文档结构的语言,它可以定义元素、属性和实体的规则和约束。

  1. bookstore [
  2. bookstore (book+)>
  3. book (title, author, price)>
  4. title (#PCDATA)>
  5. author (#PCDATA)>
  6. price (#PCDATA)>
  7. book id ID #IMPLIED>
  8. book category CDATA #REQUIRED>
  9. ]>
  10. <bookstore>
  11. <book category="Children">
  12. <title>Harry Pottertitle>
  13. <author>J.K. Rowlingauthor>
  14. <price>29.99price>
  15. book>
  16. <book category="Fiction">
  17. <title>The Catcher in the Ryetitle>
  18. <author>J.D. Salingerauthor>
  19. <price>19.99price>
  20. book>
  21. bookstore>

通过声明引用了DTD定义,然后使用定义了元素的结构,定义了元素的属性。

  • 定义了bookstore元素必须包含一个或多个book元素。
  • 定义了book元素包含title、author和price三个子元素。
  • 定义了title元素只能包含文本内容。
  • 定义了author元素只能包含文本内容。
  • 定义了price元素只能包含文本内容。
  • 定义了book元素有一个可选的id属性,类型为ID。
  • 定义了book元素必须有一个category属性,类型为CDATA。

4.生成

  1. import xml from '@ohos.xml';
  2. import util from '@ohos.util';
  3. // 1.基于Arraybuffer构造XmlSerializer对象
  4. // @ts-ignore
  5. let arrayBuffer = new ArrayBuffer(2048); // 创建一个2048字节的缓冲区
  6. // @ts-ignore
  7. let thatSer = new xml.XmlSerializer(arrayBuffer); // 基于Arraybuffer构造XmlSerializer对象
  8. // 2.基于DataView构造XmlSerializer对象
  9. // @ts-ignore
  10. let arrayBuffer = new ArrayBuffer(2048); // 创建一个2048字节的缓冲区
  11. let dataView = new DataView(arrayBuffer); // 使用DataView对象操作ArrayBuffer对象
  12. // @ts-ignore
  13. let thatSer = new xml.XmlSerializer(dataView); // 基于DataView构造XmlSerializer对象
  14. thatSer.setDeclaration(); // 写入xml的声明
  15. thatSer.startElement('bookstore'); // 写入元素开始标记
  16. thatSer.startElement('book'); // 嵌套元素开始标记
  17. thatSer.setAttributes('category', 'COOKING'); // 写入属性及属性值
  18. thatSer.startElement('title');
  19. thatSer.setAttributes('lang', 'en');
  20. thatSer.setText('Everyday'); // 写入标签值
  21. thatSer.endElement(); // 写入结束标记
  22. thatSer.startElement('author');
  23. thatSer.setText('Giada');
  24. thatSer.endElement();
  25. thatSer.startElement('year');
  26. thatSer.setText('2005');
  27. thatSer.endElement();
  28. thatSer.endElement();
  29. thatSer.endElement();
  30. let view = new Uint8Array(arrayBuffer); // 使用Uint8Array读取arrayBuffer的数据
  31. let textDecoder = util.TextDecoder.create(); // 调用util模块的TextDecoder类
  32. let res = textDecoder.decodeWithStream(view); // 对view解码
  33. console.info(res);

得到结果

  1. <?xml version=\"1.0\" encoding=\"utf-8\"?>
  2. <bookstore>\r\n
  3. <book category=\"COOKING\">\r\n
  4. <title lang=\"en\">Everyday</title>\r\n
  5. <author>Giada</author>\r\n
  6. <year>2005</year>\r\n
  7. </book>\r\n
  8. </bookstore>

5.解析

?5.1 解析XML标签和标签值

  1. import xml from '@ohos.xml';
  2. import util from '@ohos.util'; // 需要使用util模块函数对文件编码
  3. let strXml =
  4. '' +
  5. '' +
  6. 'Play' +
  7. 'Work' +
  8. '';
  9. let textEncoder = new util.TextEncoder();
  10. let arrBuffer = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码
  11. // 1.基于ArrayBuffer构造XmlPullParser对象
  12. let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
  13. // // 2.基于DataView构造XmlPullParser对象
  14. // let dataView = new DataView(arrBuffer.buffer);
  15. // let that = new xml.XmlPullParser(dataView, 'UTF-8');
  16. let str = '';
  17. function func(name, value){
  18. str = name + value;
  19. console.info(str);
  20. return true; //true:继续解析 false:停止解析
  21. }
  22. let options = {supportDoctype:true, ignoreNameSpace:true, tagValueCallbackFunction:func};
  23. that.parse(options);

得到结果

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

在这里插入图片描述

?5.2 解析XML属性和属性值

  1. import xml from '@ohos.xml';
  2. import util from '@ohos.util'; // 需要使用util模块函数对文件编码
  3. let strXml =
  4. '' +
  5. '' +
  6. ' Play' +
  7. ' Happy' +
  8. ' Work' +
  9. '';
  10. let textEncoder = new util.TextEncoder();
  11. let arrBuffer = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码
  12. let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
  13. let str = '';
  14. function func(name, value){
  15. str += name + ' ' + value + ' ';
  16. return true; // true:继续解析 false:停止解析
  17. }
  18. let options = {supportDoctype:true, ignoreNameSpace:true, attributeValueCallbackFunction:func};
  19. that.parse(options);
  20. console.info(str); // 一次打印出所有的属性及其值

在这里插入图片描述

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

  1. import xml from '@ohos.xml';
  2. import util from '@ohos.util'; // 需要使用util模块函数对文件编码
  3. let strXml =
  4. '' +
  5. '' +
  6. 'Play' +
  7. '';
  8. let textEncoder = new util.TextEncoder();
  9. let arrBuffer = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码
  10. let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
  11. let str = '';
  12. function func(name, value){
  13. str = name + ' ' + value.getDepth(); // getDepth 获取元素的当前深度
  14. console.info(str)
  15. return true; //true:继续解析 false:停止解析
  16. }
  17. let options = {supportDoctype:true, ignoreNameSpace:true, tokenValueCallbackFunction:func};
  18. that.parse(options);
  19. console.info(str); // 一次打印出所有的属性及其值

得到结果

  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

在这里插入图片描述

?5.4 场景示例

  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

在这里插入图片描述

6.转换

  1. import convertxml from '@ohos.convertxml';
  2. let xml =
  3. '' +
  4. '' +
  5. ' Happy' +
  6. ' Work' +
  7. ' Play' +
  8. '';
  9. let options = {
  10. // trim: false 转换后是否删除文本前后的空格,否
  11. // declarationKey: "_declaration" 转换后文件声明使用_declaration来标识
  12. // instructionKey: "_instruction" 转换后指令使用_instruction标识
  13. // attributesKey: "_attributes" 转换后属性使用_attributes标识
  14. // textKey: "_text" 转换后标签值使用_text标识
  15. // cdataKey: "_cdata" 转换后未解析数据使用_cdata标识
  16. // docTypeKey: "_doctype" 转换后文档类型使用_doctype标识
  17. // commentKey: "_comment" 转换后注释使用_comment标识
  18. // parentKey: "_parent" 转换后父类使用_parent标识
  19. // typeKey: "_type" 转换后元素类型使用_type标识
  20. // nameKey: "_name" 转换后标签名称使用_name标识
  21. // elementsKey: "_elements" 转换后元素使用_elements标识
  22. trim: false, declarationKey: "_declaration",
  23. instructionKey: "_instruction", attributesKey: "_attributes",
  24. textKey: "_text", cdataKey: "_cdata", doctypeKey: "_doctype",
  25. commentKey: "_comment", parentKey: "_parent", typeKey: "_type",
  26. nameKey: "_name", elementsKey: "_elements"
  27. }
  28. let conv = new convertxml.ConvertXML();
  29. let result = conv.convertToJSObject(xml, options);
  30. let strRes = JSON.stringify(result); // 将js对象转换为json字符串,用于显式输出
  31. console.info(strRes);
  32. // 也可以直接处理转换后的JS对象,获取标签值
  33. let title = result['_elements'][0]['_elements'][0]['_elements'][0]['_text']; // 解析<title>标签对应的值
  34. let todo = result['_elements'][0]['_elements'][1]['_elements'][0]['_text']; // 解析<todo>标签对应的值
  35. let todo2 = result['_elements'][0]['_elements'][2]['_elements'][0]['_text']; // 解析<todo>标签对应的值
  36. console.info(title); // Happy
  37. console.info(todo); // Work
  38. console.info(todo2); // Play

在这里插入图片描述

 ?写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing?,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新VIP学习资料,请点击→全套鸿蒙HarmonyOS学习资料
  • 或者关注小编后私信回复【666】也可获取资料哦~~

注:本文转载自blog.csdn.net的蜀道山QAQ的文章"https://blog.csdn.net/shudaoshanQAQ/article/details/135531426"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top