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 ```