xml-parsing.md 8.2 KB
Newer Older
G
ge-yafang 已提交
1 2 3 4 5 6
# XML解析


对于以XML作为载体传递的数据,实际使用中需要对相关的节点进行解析,一般包括[解析XML标签和标签值](#解析xml标签和标签值)[解析XML属性和属性值](#解析xml属性和属性值)[解析XML事件类型和元素深度](#解析xml事件类型和元素深度)三类场景。


7
XML模块提供XmlPullParser类对XML文件解析,输入为含有XML文本的ArrayBuffer或DataView,输出为解析得到的信息。
G
ge-yafang 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22


  **表1** XML解析选项

| 名称 | 类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| supportDoctype | boolean | 否 | 是否忽略文档类型。默认为false,表示对文档类型进行解析。 |
| ignoreNameSpace | boolean | 否 | 是否忽略命名空间。默认为false,表示对命名空间进行解析。 |
| tagValueCallbackFunction | (name: string, value: string) => boolean | 否 | 获取tagValue回调函数,打印标签及标签值。默认为null,表示不进行XML标签和标签值的解析。 |
| attributeValueCallbackFunction | (name: string, value: string) => boolean | 否 | 获取attributeValue回调函数, 打印属性及属性值。默认为null,表示不进行XML属性和属性值的解析。 |
| tokenValueCallbackFunction | (eventType: EventType, value: ParseInfo) => boolean | 否 | 获取tokenValue回调函数,打印标签事件类型及parseInfo对应属性。默认为null,表示不进行XML事件类型解析。 |


## 注意事项

G
ge-yafang 已提交
23
- XML解析及转换需要确保传入的XML数据符合标准格式。
G
ge-yafang 已提交
24 25 26 27 28 29 30

- XML解析目前不支持按指定节点解析对应的节点值。


## 解析XML标签和标签值

1. 引入模块。
31

32 33 34 35
    ```ts
    import xml from '@ohos.xml';
    import util from '@ohos.util'; // 需要使用util模块函数对文件编码
    ```
G
ge-yafang 已提交
36 37

2. 对XML文件编码后调用XmlPullParser。
W
wusongqing 已提交
38
   可以基于ArrayBuffer构造XmlPullParser对象, 也可以基于DataView构造XmlPullParser对象。
G
ge-yafang 已提交
39

40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
    ```ts
    let strXml: string =
    '<?xml version="1.0" encoding="utf-8"?>' +
      '<note importance="high" logged="true">' +
      '<title>Play</title>' +
      '<lens>Work</lens>' +
      '</note>';
    let textEncoder: util.TextEncoder = new util.TextEncoder();
    let arrBuffer: Uint8Array = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码
    // 1.基于ArrayBuffer构造XmlPullParser对象
    let that: xml.XmlPullParser = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
   
    // 2.基于DataView构造XmlPullParser对象
    let dataView: DataView = new DataView(arrBuffer.buffer);
    let that: xml.XmlPullParser = new xml.XmlPullParser(dataView, 'UTF-8');
    ```
G
ge-yafang 已提交
56 57

3. 自定义回调函数,本例直接打印出标签及标签值。
58

59 60 61 62 63 64 65 66
    ```ts
    let str: string = '';
    function func(name: string, value: string): boolean {
      str = name + value;
      console.info(str);
      return true; //true:继续解析 false:停止解析
    }
    ```
G
ge-yafang 已提交
67 68

4. 设置解析选项,调用parse函数。
69

70 71 72 73
    ```ts
    let options: xml.ParseOptions = {supportDoctype:true, ignoreNameSpace:true, tagValueCallbackFunction:func};
    that.parse(options);
    ```
G
ge-yafang 已提交
74

75 76 77 78 79 80 81 82 83 84 85 86
	输出结果如下所示:

	```
	note
	title
	Play
	title
	lens
	Work
	lens
	note
	```
G
ge-yafang 已提交
87

88

G
ge-yafang 已提交
89 90 91 92 93


## 解析XML属性和属性值

1. 引入模块。
94

95 96 97 98
    ```ts
    import xml from '@ohos.xml';
    import util from '@ohos.util'; // 需要使用util模块函数对文件编码
    ```
G
ge-yafang 已提交
99 100

2. 对XML文件编码后调用XmlPullParser。
101

102 103 104 105 106 107 108 109 110 111 112 113
    ```ts
    let strXml: string =
      '<?xml version="1.0" encoding="utf-8"?>' +
        '<note importance="high" logged="true">' +
        '    <title>Play</title>' +
        '    <title>Happy</title>' +
        '    <lens>Work</lens>' +
        '</note>';
    let textEncoder: util.TextEncoder = new util.TextEncoder();
    let arrBuffer: Uint8Array = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码
    let that: xml.XmlPullParser = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
    ```
G
ge-yafang 已提交
114 115

3. 自定义回调函数,本例直接打印出属性及属性值。
116

117 118 119 120 121 122 123
    ```ts
    let str: string = '';
    function func(name: string, value: string): boolean {
      str += name + ' ' + value + ' ';
      return true; // true:继续解析 false:停止解析
    }
    ```
G
ge-yafang 已提交
124 125

4. 设置解析选项,调用parse函数。
126

127 128 129 130 131
    ```ts
    let options: xml.ParseOptions = {supportDoctype:true, ignoreNameSpace:true, attributeValueCallbackFunction:func};
    that.parse(options);
    console.info(str); // 一次打印出所有的属性及其值
    ```
G
ge-yafang 已提交
132 133

   输出结果如下所示:
134
   ```
G
ge-yafang 已提交
135 136 137 138 139 140 141
   importance high logged true // note节点的属性及属性值
   ```


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

1. 引入模块。
142

143 144 145 146
    ```ts
    import xml from '@ohos.xml';
    import util from '@ohos.util'; // 需要使用util模块函数对文件编码
    ```
G
ge-yafang 已提交
147 148

2. 对XML文件编码后调用XmlPullParser。
149

150 151 152 153 154 155 156 157 158 159
    ```ts
    let strXml: string =
      '<?xml version="1.0" encoding="utf-8"?>' +
      '<note importance="high" logged="true">' +
      '<title>Play</title>' +
      '</note>';
    let textEncoder: util.TextEncoder = new util.TextEncoder();
    let arrBuffer: Uint8Array = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码
    let that: xml.XmlPullParser = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
    ```
G
ge-yafang 已提交
160 161

3. 自定义回调函数,本例直接打印元素事件类型及元素深度。
162

163 164 165 166 167 168 169 170
    ```ts
    let str: string  = '';
    function func(name: xml.EventType, value: xml.ParseInfo): boolean {
      str = name + ' ' + value.getDepth(); // getDepth 获取元素的当前深度
      console.info(str)
      return true; //true:继续解析 false:停止解析
    }
    ```
G
ge-yafang 已提交
171 172

4. 设置解析选项,调用parse函数。
173

174 175 176 177
     ```ts
     let options: xml.ParseOptions = {supportDoctype:true, ignoreNameSpace:true, tokenValueCallbackFunction:func};
     that.parse(options);
     ```
G
ge-yafang 已提交
178 179 180

   输出结果如下所示:

181 182 183 184 185 186 187 188 189 190
	```
	 0 0 // 0:<?xml version="1.0" encoding="utf-8"?> 对应事件类型		START_DOCUMENT值为0  0:起始深度为0
	 2 1 // 2:<note importance="high" logged="true"> 对应事件类型START_TAG值为2       1:深度为1
	 2 2 // 2:<title>对应事件类型START_TAG值为2                                       2:深度为2
	 4 2 // 4:Play对应事件类型TEXT值为4                                               2:深度为2
	 3 2 // 3:</title>对应事件类型END_TAG值为3                                        2:深度为2
	 3 1 // 3:</note>对应事件类型END_TAG值为3                                         1:深度为1(与<note对应>
	 1 0 // 1:对应事件类型END_DOCUMENT值为1                                           0:深度为0
	```

191

G
ge-yafang 已提交
192 193 194 195 196 197 198


## 场景示例

此处以调用所有解析选项为例,提供解析XML标签、属性和事件类型的开发示例。


199
```ts
G
ge-yafang 已提交
200 201 202
import xml from '@ohos.xml';
import util from '@ohos.util';

203
let strXml: string =
G
ge-yafang 已提交
204 205 206 207 208
  '<?xml version="1.0" encoding="UTF-8"?>' +
    '<book category="COOKING">' +
    '<title lang="en">Everyday</title>' +
    '<author>Giada</author>' +
    '</book>';
209 210 211 212
let textEncoder: util.TextEncoder = new util.TextEncoder();
let arrBuffer: Uint8Array = textEncoder.encodeInto(strXml);
let that: xml.XmlPullParser = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
let str: string = '';
G
ge-yafang 已提交
213

214
function tagFunc(name: string, value: string): boolean {
G
ge-yafang 已提交
215 216 217 218 219
  str = name + value;
  console.info('tag-' + str);
  return true;
}

220
function attFunc(name: xml.EventType, value: string): boolean {
G
ge-yafang 已提交
221 222 223 224 225
  str = name + ' ' + value;
  console.info('attri-' + str);
  return true;
}

226
function tokenFunc(name: xml.EventType, value: xml.ParseInfo): boolean {
G
ge-yafang 已提交
227 228 229 230 231
  str = name + ' ' + value.getDepth();
  console.info('token-' + str);
  return true;
}

232
let options: xml.ParseOptions = {
G
ge-yafang 已提交
233 234 235 236 237 238 239 240 241 242 243
  supportDocType: true,
  ignoreNameSpace: true,
  tagValueCallbackFunction: tagFunc,
  attributeValueCallbackFunction: attFunc,
  tokenValueCallbackFunction: tokenFunc
};
that.parse(options);
```

输出结果如下所示:

244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
   ```
   tag-
   token-0 0
   tag-book
   attri-category COOKING
   token-2 1
   tag-title
   attri-lang en
   token-2 2
   tag-Everyday
   token-4 2
   tag-title
   token-3 2
   tag-author
   token-2 2
   tag-Giada
   token-4 2
   tag-author
   token-3 2
   tag-book
   token-3 1
   tag-
   token-1 0
   ```