1# XML解析 2 3 4对于以XML作为载体传递的数据,实际使用中需要对相关的节点进行解析,一般包括[解析XML标签和标签值](#解析xml标签和标签值)、[解析XML属性和属性值](#解析xml属性和属性值)、[解析XML事件类型和元素深度](#解析xml事件类型和元素深度)三类场景。 5 6 7XML模块提供XmlPullParser类对XML文件解析,输入为含有XML文本的ArrayBuffer或DataView,输出为解析得到的信息。 8 9 10 **表1** XML解析选项 11 12| 名称 | 类型 | 必填 | 说明 | 13| -------- | -------- | -------- | -------- | 14| supportDoctype | boolean | 否 | 是否忽略文档类型。默认为false,表示对文档类型进行解析。 | 15| ignoreNameSpace | boolean | 否 | 是否忽略命名空间。默认为false,表示对命名空间进行解析。 | 16| tagValueCallbackFunction | (name: string, value: string) => boolean | 否 | 获取tagValue回调函数,打印标签及标签值。默认为null,表示不进行XML标签和标签值的解析。 | 17| attributeValueCallbackFunction | (name: string, value: string) => boolean | 否 | 获取attributeValue回调函数, 打印属性及属性值。默认为null,表示不进行XML属性和属性值的解析。 | 18| tokenValueCallbackFunction | (eventType: EventType, value: ParseInfo) => boolean | 否 | 获取tokenValue回调函数,打印标签事件类型及parseInfo对应属性。默认为null,表示不进行XML事件类型解析。 | 19 20 21## 注意事项 22 23- XML解析及转换需要确保传入的XML数据符合标准格式。 24 25- XML解析目前不支持按指定节点解析对应的节点值。 26 27 28## 解析XML标签和标签值 29 301. 引入模块。 31 32 ```ts 33 import xml from '@ohos.xml'; 34 import util from '@ohos.util'; // 需要使用util模块函数对文件编码 35 ``` 36 372. 对XML文件编码后调用XmlPullParser。 38 可以基于ArrayBuffer构造XmlPullParser对象, 也可以基于DataView构造XmlPullParser对象。 39 40 ```ts 41 let strXml: string = 42 '<?xml version="1.0" encoding="utf-8"?>' + 43 '<note importance="high" logged="true">' + 44 '<title>Play</title>' + 45 '<lens>Work</lens>' + 46 '</note>'; 47 let textEncoder: util.TextEncoder = new util.TextEncoder(); 48 let arrBuffer: Uint8Array = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码 49 // 1.基于ArrayBuffer构造XmlPullParser对象 50 let that: xml.XmlPullParser = new xml.XmlPullParser(arrBuffer.buffer as object as ArrayBuffer, 'UTF-8'); 51 52 // 2.基于DataView构造XmlPullParser对象 53 // let dataView: DataView = new DataView(arrBuffer.buffer as object as ArrayBuffer); 54 // let that: xml.XmlPullParser = new xml.XmlPullParser(dataView, 'UTF-8'); 55 ``` 56 573. 自定义回调函数,本例直接打印出标签及标签值。 58 59 ```ts 60 let str: string = ''; 61 function func(name: string, value: string): boolean { 62 str = name + value; 63 console.info(str); 64 return true; //true:继续解析 false:停止解析 65 } 66 ``` 67 684. 设置解析选项,调用parse函数。 69 70 ```ts 71 let options: xml.ParseOptions = {supportDoctype:true, ignoreNameSpace:true, tagValueCallbackFunction:func}; 72 that.parse(options); 73 ``` 74 75 输出结果如下所示: 76 77 ``` 78 note 79 title 80 Play 81 title 82 lens 83 Work 84 lens 85 note 86 ``` 87 88 89 90 91## 解析XML属性和属性值 92 931. 引入模块。 94 95 ```ts 96 import xml from '@ohos.xml'; 97 import util from '@ohos.util'; // 需要使用util模块函数对文件编码 98 ``` 99 1002. 对XML文件编码后调用XmlPullParser。 101 102 ```ts 103 let strXml: string = 104 '<?xml version="1.0" encoding="utf-8"?>' + 105 '<note importance="high" logged="true">' + 106 ' <title>Play</title>' + 107 ' <title>Happy</title>' + 108 ' <lens>Work</lens>' + 109 '</note>'; 110 let textEncoder: util.TextEncoder = new util.TextEncoder(); 111 let arrBuffer: Uint8Array = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码 112 let that: xml.XmlPullParser = new xml.XmlPullParser(arrBuffer.buffer as object as ArrayBuffer, 'UTF-8'); 113 ``` 114 1153. 自定义回调函数,本例直接打印出属性及属性值。 116 117 ```ts 118 let str: string = ''; 119 function func(name: string, value: string): boolean { 120 str += name + ' ' + value + ' '; 121 return true; // true:继续解析 false:停止解析 122 } 123 ``` 124 1254. 设置解析选项,调用parse函数。 126 127 ```ts 128 let options: xml.ParseOptions = {supportDoctype:true, ignoreNameSpace:true, attributeValueCallbackFunction:func}; 129 that.parse(options); 130 console.info(str); // 一次打印出所有的属性及其值 131 ``` 132 133 输出结果如下所示: 134 ``` 135 importance high logged true // note节点的属性及属性值 136 ``` 137 138 139## 解析XML事件类型和元素深度 140 1411. 引入模块。 142 143 ```ts 144 import xml from '@ohos.xml'; 145 import util from '@ohos.util'; // 需要使用util模块函数对文件编码 146 ``` 147 1482. 对XML文件编码后调用XmlPullParser。 149 150 ```ts 151 let strXml: string = 152 '<?xml version="1.0" encoding="utf-8"?>' + 153 '<note importance="high" logged="true">' + 154 '<title>Play</title>' + 155 '</note>'; 156 let textEncoder: util.TextEncoder = new util.TextEncoder(); 157 let arrBuffer: Uint8Array = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码 158 let that: xml.XmlPullParser = new xml.XmlPullParser(arrBuffer.buffer as object as ArrayBuffer, 'UTF-8'); 159 ``` 160 1613. 自定义回调函数,本例直接打印元素事件类型及元素深度。 162 163 ```ts 164 let str: string = ''; 165 function func(name: xml.EventType, value: xml.ParseInfo): boolean { 166 str = name + ' ' + value.getDepth(); // getDepth 获取元素的当前深度 167 console.info(str) 168 return true; //true:继续解析 false:停止解析 169 } 170 ``` 171 1724. 设置解析选项,调用parse函数。 173 174 ```ts 175 let options: xml.ParseOptions = {supportDoctype:true, ignoreNameSpace:true, tokenValueCallbackFunction:func}; 176 that.parse(options); 177 ``` 178 179 输出结果如下所示: 180 181 ``` 182 0 0 // 0:<?xml version="1.0" encoding="utf-8"?> 对应事件类型 START_DOCUMENT值为0 0:起始深度为0 183 2 1 // 2:<note importance="high" logged="true"> 对应事件类型START_TAG值为2 1:深度为1 184 2 2 // 2:<title>对应事件类型START_TAG值为2 2:深度为2 185 4 2 // 4:Play对应事件类型TEXT值为4 2:深度为2 186 3 2 // 3:</title>对应事件类型END_TAG值为3 2:深度为2 187 3 1 // 3:</note>对应事件类型END_TAG值为3 1:深度为1(与<note对应>) 188 1 0 // 1:对应事件类型END_DOCUMENT值为1 0:深度为0 189 ``` 190 191 192 193 194## 场景示例 195 196此处以调用所有解析选项为例,提供解析XML标签、属性和事件类型的开发示例。 197 198 199```ts 200import xml from '@ohos.xml'; 201import util from '@ohos.util'; 202 203let strXml: string = 204 '<?xml version="1.0" encoding="UTF-8"?>' + 205 '<book category="COOKING">' + 206 '<title lang="en">Everyday</title>' + 207 '<author>Giada</author>' + 208 '</book>'; 209let textEncoder: util.TextEncoder = new util.TextEncoder(); 210let arrBuffer: Uint8Array = textEncoder.encodeInto(strXml); 211let that: xml.XmlPullParser = new xml.XmlPullParser(arrBuffer.buffer as object as ArrayBuffer, 'UTF-8'); 212let str: string = ''; 213 214function tagFunc(name: string, value: string): boolean { 215 str = name + value; 216 console.info('tag-' + str); 217 return true; 218} 219 220function attFunc(name: string, value: string): boolean { 221 str = name + ' ' + value; 222 console.info('attri-' + str); 223 return true; 224} 225 226function tokenFunc(name: xml.EventType, value: xml.ParseInfo): boolean { 227 str = name + ' ' + value.getDepth(); 228 console.info('token-' + str); 229 return true; 230} 231 232let options: xml.ParseOptions = { 233 supportDoctype: true, 234 ignoreNameSpace: true, 235 tagValueCallbackFunction: tagFunc, 236 attributeValueCallbackFunction: attFunc, 237 tokenValueCallbackFunction: tokenFunc 238}; 239that.parse(options); 240``` 241 242输出结果如下所示: 243 244 ``` 245 tag- 246 token-0 0 247 tag-book 248 attri-category COOKING 249 token-2 1 250 tag-title 251 attri-lang en 252 token-2 2 253 tag-Everyday 254 token-4 2 255 tag-title 256 token-3 2 257 tag-author 258 token-2 2 259 tag-Giada 260 token-4 2 261 tag-author 262 token-3 2 263 tag-book 264 token-3 1 265 tag- 266 token-1 0 267 ``` 268