• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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