• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# XML生成
2<!--Kit: ArkTS-->
3<!--Subsystem: CommonLibrary-->
4<!--Owner: @xliu-huanwei; @shilei123; @huanghello-->
5<!--Designer: @yuanyao14-->
6<!--Tester: @kirl75; @zsw_zhushiwei-->
7<!--Adviser: @ge-yafang-->
8
9
10XML可以作为数据交换格式,被各种系统和应用程序支持。例如Web服务,可以将结构化数据以XML格式进行传递。
11
12
13XML还可以作为消息传递格式,用于分布式系统中不同节点的通信。
14
15
16## 注意事项
17
18- XML标签必须成对出现,生成开始标签就要生成结束标签。
19
20- XML标签对大小写敏感,开始标签与结束标签大小写要一致。
21
22
23## 开发步骤
24
25XML模块提供`XmlSerializer`及`XmlDynamicSerializer`类来生成XML数据,使用`XmlSerializer`需传入固定长度的`ArrayBuffer`或`DataView`对象作为输出缓冲区,用于存储序列化后的XML数据。
26`XmlDynamicSerializer`类动态扩容,程序根据实际生成的数据大小自动创建`ArrayBuffer`。
27
28调用不同的方法写入不同的内容,如startElement(name: string)写入元素开始标记,setText(text: string)写入标签值。
29
30XML模块的API接口可以参考[@ohos.xml](../reference/apis-arkts/js-apis-xml.md)的详细描述,按需求调用相应的函数可以生成一份完整的XML数据。
31
32使用XmlSerializer生成XML示例如下:
33
341. 引入模块。
35
36   ```ts
37   import { xml, util } from '@kit.ArkTS';
38   ```
39
402. 创建缓冲区,构造XmlSerializer对象。可以基于ArrayBuffer构造XmlSerializer对象,也可以基于DataView构造XmlSerializer对象。
41
42   方式1:基于ArrayBuffer构造XmlSerializer对象
43
44   ```ts
45   let arrayBuffer: ArrayBuffer = new ArrayBuffer(2048); // 创建一个2048字节的缓冲区
46   let serializer: xml.XmlSerializer = new xml.XmlSerializer(arrayBuffer); // 基于ArrayBuffer构造XmlSerializer对象
47   ```
48
49   方式2:基于DataView构造XmlSerializer对象
50
51   ```ts
52   let arrayBuffer: ArrayBuffer = new ArrayBuffer(2048); // 创建一个2048字节的缓冲区
53   let dataView: DataView = new DataView(arrayBuffer); // 创建一个DataView
54   let serializer: xml.XmlSerializer = new xml.XmlSerializer(dataView); // 基于DataView构造XmlSerializer对象
55   ```
56
573. 调用XML元素生成函数。
58
59   ```ts
60   serializer.setDeclaration(); // 写入XML的声明
61   serializer.startElement('bookstore'); // 写入元素开始标记
62   serializer.startElement('book'); // 嵌套元素开始标记
63   serializer.setAttributes('category', 'COOKING'); // 写入属性及其属性值
64   serializer.startElement('title');
65   serializer.setAttributes('lang', 'en');
66   serializer.setText('Everyday'); // 写入标签值
67   serializer.endElement(); // 写入结束标记
68   serializer.startElement('author');
69   serializer.setText('Giana');
70   serializer.endElement();
71   serializer.startElement('year');
72   serializer.setText('2005');
73   serializer.endElement();
74   serializer.endElement();
75   serializer.endElement();
76   ```
77
784. 使用Uint8Array操作ArrayBuffer,并调用TextDecoder对Uint8Array解码后输出。
79
80   ```ts
81   let uint8Array: Uint8Array = new Uint8Array(arrayBuffer); // 使用Uint8Array读取arrayBuffer的数据
82   let textDecoder: util.TextDecoder = util.TextDecoder.create(); // 调用util模块的TextDecoder类
83   let result: string = textDecoder.decodeToString(uint8Array); // 对uint8Array解码
84   console.info(result);
85   ```
86
87   输出结果如下:
88
89   ```
90   <?xml version="1.0" encoding="utf-8"?><bookstore>
91     <book category="COOKING">
92       <title lang="en">Everyday</title>
93       <author>Giana</author>
94       <year>2005</year>
95     </book>
96   </bookstore>
97   ```
98
99使用`XmlDynamicSerializer`生成XML示例如下:
100
1011. 引入模块。
102
103   ```ts
104   import { xml, util } from '@kit.ArkTS';
105   ```
106
1072. 调用XML元素生成函数。
108
109   ```ts
110   let DySerializer = new xml.XmlDynamicSerializer('utf-8');
111   DySerializer.setDeclaration(); // 写入XML的声明
112   DySerializer.startElement('bookstore'); // 写入元素开始标记
113   DySerializer.startElement('book'); // 嵌套元素开始标记
114   DySerializer.setAttributes('category', 'COOKING'); // 写入属性及其属性值
115   DySerializer.startElement('title');
116   DySerializer.setAttributes('lang', 'en');
117   DySerializer.setText('Everyday'); // 写入标签值
118   DySerializer.endElement(); // 写入结束标记
119   DySerializer.startElement('author');
120   DySerializer.setText('Giana');
121   DySerializer.endElement();
122   DySerializer.startElement('year');
123   DySerializer.setText('2005');
124   DySerializer.endElement();
125   DySerializer.endElement();
126   DySerializer.endElement();
127   let arrayBuffer = DySerializer.getOutput();
128   ```
129
1304. 使用Uint8Array操作ArrayBuffer,并调用TextDecoder对Uint8Array解码后输出。
131
132   ```ts
133   let uint8Array: Uint8Array = new Uint8Array(arrayBuffer);
134   let result: string = util.TextDecoder.create().decodeToString(uint8Array);
135   console.info(result);
136   ```
137
138   输出结果如下:
139
140   ```
141   <?xml version="1.0" encoding="utf-8"?>
142   <bookstore>
143     <book category="COOKING">
144       <title lang="en">Everyday</title>
145       <author>Giana</author>
146       <year>2005</year>
147     </book>
148   </bookstore>
149   ```