# XML Parsing
Data transferred in XML format must be parsed in actual use. Generally, three types of elements need to be parsed, as described in [Parsing XML Tags and Tag Values](#parsing-xml-tags-and-tag-values), [Parsing XML Attributes and Attribute Values](#parsing-xml-attributes-and-attribute-values), and [Parsing XML Event Types and Element Depths](#parsing-xml-event-types-and-element-depths).
The **xml** module provides the **XmlPullParser** class to parse XML files. The input is an object of the ArrayBuffer or DataView type containing XML text, and the output is the parsed information.
**Table 1** XML parsing options
| Name| Type| Mandatory| Description|
| -------- | -------- | -------- | -------- |
| supportDoctype | boolean | No| Whether to ignore the document type. The default value is **false**, indicating that the document type is parsed.|
| ignoreNameSpace | boolean | No| Whether to ignore the namespace. The default value is **false**, indicating that the namespace is parsed.|
| tagValueCallbackFunction | (name: string, value: string) => boolean | No| Callback used to return **tagValue**, which consists of a tag and its value. The default value is **null**, indicating that XML tags and tag values are not parsed.|
| attributeValueCallbackFunction | (name: string, value: string) => boolean | No| Callback used to return **attributeValue**, which consists of an attribute and its value. The default value is **null**, indicating that XML attributes and attribute values are not parsed.|
| tokenValueCallbackFunction | (eventType: EventType, value: ParseInfo) => boolean | No| Callback used to return **tokenValue**, which consists of the event type and the attributes of **parseInfo**. The default value is **null**, indicating that the event type and the attributes of **parseInfo** are not parsed.|
## Precautions
- To ensure successful XML parsing and conversion, the input XML data must comply with the standard format.
- Currently, parsing a given node is not supported.
## Parsing XML Tags and Tag Values
1. Import the modules.
```js
import xml from '@ohos.xml';
import util from '@ohos.util'; // Use the API provided by the util module to encode the file.
```
2. Create an **XmlPullParser** object.
The **XmlPullParser** object can be created based on an object of the ArrayBuffer or DataView type.
```js
let strXml =
'' +
'' +
'Play' +
'Work' +
'';
let textEncoder = new util.TextEncoder();
let arrBuffer = textEncoder.encodeInto(strXml); // Encode the data to prevent garbled characters.
// 1. Create an XmlPullParser object based on an object of the ArrayBuffer type.
let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
// 2. Create an XmlPullParser object based on an object of the DataView type.
let dataView = new DataView(arrBuffer.buffer);
let that = new xml.XmlPullParser(dataView, 'UTF-8');
```
3. Customize a callback function. In this example, the tag and tag value are directly printed.
```js
let str = '';
function func(name, value){
str = name + value;
console.info(str);
return true; // The value true means to continue parsing, and false means to stop parsing.
}
```
4. Set parsing options and call the **parse()** function.
```js
let options = {supportDoctype:true, ignoreNameSpace:true, tagValueCallbackFunction:func};
that.parse(options);
```
The output is as follows:
```js
note
title
Play
title
lens
Work
lens
note
```
## Parsing XML Attributes and Attribute Values
1. Import the modules.
```js
import xml from '@ohos.xml';
import util from '@ohos.util'; // Use the API provided by the util module to encode the file.
```
2. Create an **XmlPullParser** object.
```js
let strXml =
'' +
'' +
' Play' +
' Happy' +
' Work' +
'';
let textEncoder = new util.TextEncoder();
let arrBuffer = textEncoder.encodeInto(strXml); // Encode the data to prevent garbled characters.
let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
```
3. Customize a callback function. In this example, the attribute and attribute value are directly printed.
```js
let str = '';
function func(name, value){
str += name + ' ' + value + ' ';
return true; // The value true means to continue parsing, and false means to stop parsing.
}
```
4. Set parsing options and call the **parse()** function.
```js
let options = {supportDoctype:true, ignoreNameSpace:true, attributeValueCallbackFunction:func};
that.parse(options);
console.info(str); // Print all attributes and their values at a time.
```
The output is as follows:
```js
importance high logged true // Attributes and attribute values of the note node
```
## Parsing XML Event Types and Element Depths
1. Import the modules.
```js
import xml from '@ohos.xml';
import util from '@ohos.util'; // Use the API provided by the util module to encode the file.
```
2. Create an **XmlPullParser** object.
```js
let strXml =
'' +
'' +
'Play' +
'';
let textEncoder = new util.TextEncoder();
let arrBuffer = textEncoder.encodeInto(strXml); // Encode the data to prevent garbled characters.
let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
```
3. Customize a callback function. In this example, the event type and element depth are directly printed.
```js
let str = '';
function func(name, value){
str = name +' ' + value.getDepth(); // getDepth is called to obtain the element depth.
console.info(str)
return true; // The value true means to continue parsing, and false means to stop parsing.
}
```
4. Set parsing options and call the **parse()** function.
```js
let options = {supportDoctype:true, ignoreNameSpace:true, tokenValueCallbackFunction:func};
that.parse(options);
```
The output is as follows:
```js
0 0 // 0: . The event type value of START_DOCUMENT is 0. 0: The depth is 0.
2 1 // 2: . The event type value of START_TAG is 2. 1: The depth is 1.
2 2 // 2: . The event type value of START_TAG is 2. 2: The depth is 2.
4 2 // 4: Play. The event type value of TEXT is 4. 2: The depth is 2.
3 2 // 3: . The event type value of END_TAG is 3. 2: The depth is 2.
3 1 // 3: . The event type value of END_TAG is 3. 1: The depth is 1 (corresponding to ).
1 0 // 1: The event type value of END_DOCUMENT is 1. 0: The depth is 0.
```
## Example Scenario
The following uses invoking all parsing options as an example to describe how to parse XML tags, attributes, and event types.
```js
import xml from '@ohos.xml';
import util from '@ohos.util';
let strXml =
'' +
'' +
'Everyday' +
'Giada' +
'';
let textEncoder = new util.TextEncoder();
let arrBuffer = textEncoder.encodeInto(strXml);
let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
let str = '';
function tagFunc(name, value) {
str = name + value;
console.info('tag-' + str);
return true;
}
function attFunc(name, value) {
str = name + ' ' + value;
console.info('attri-' + str);
return true;
}
function tokenFunc(name, value) {
str = name + ' ' + value.getDepth();
console.info('token-' + str);
return true;
}
let options = {
supportDocType: true,
ignoreNameSpace: true,
tagValueCallbackFunction: tagFunc,
attributeValueCallbackFunction: attFunc,
tokenValueCallbackFunction: tokenFunc
};
that.parse(options);
```
The output is as follows:
```js
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
```