XML解析

2024-02-16 13:48 更新

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

XML模块提供XmlPullParser类对XML文件解析,输入为含有XML文本的ArrayBuffer或DataView,输出为解析得到的信息。

表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事件类型解析。

注意事项

  • XML解析及转换需要确保传入的XML数据符合标准格式。

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

解析XML标签和标签值

  1. 引入模块。

    1. import xml from '@ohos.xml';
    2. import util from '@ohos.util'; // 需要使用util模块函数对文件编码
  2. 对XML文件编码后调用XmlPullParser。

    可以基于ArrayBuffer构造XmlPullParser对象, 也可以基于DataView构造XmlPullParser对象。

    1. let strXml =
    2. '<?xml version="1.0" encoding="utf-8"?>' +
    3. '<note importance="high" logged="true">' +
    4. '<title>Play</title>' +
    5. '<lens>Work</lens>' +
    6. '</note>';
    7. let textEncoder = new util.TextEncoder();
    8. let arrBuffer = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码
    9. // 1.基于ArrayBuffer构造XmlPullParser对象
    10. let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
    11. // 2.基于DataView构造XmlPullParser对象
    12. let dataView = new DataView(arrBuffer.buffer);
    13. let that = new xml.XmlPullParser(dataView, 'UTF-8');
  3. 自定义回调函数,本例直接打印出标签及标签值。

    1. let str = '';
    2. function func(name, value){
    3. str = name + value;
    4. console.info(str);
    5. return true; //true:继续解析 false:停止解析
    6. }
  4. 设置解析选项,调用parse函数。

    1. let options = {supportDoctype:true, ignoreNameSpace:true, tagValueCallbackFunction:func};
    2. that.parse(options);

    输出结果如下所示:

    1. note
    2. title
    3. Play
    4. title
    5. lens
    6. Work
    7. lens
    8. note

解析XML属性和属性值

  1. 引入模块。

    1. import xml from '@ohos.xml';
    2. import util from '@ohos.util'; // 需要使用util模块函数对文件编码
  2. 对XML文件编码后调用XmlPullParser。

    1. let strXml =
    2. '<?xml version="1.0" encoding="utf-8"?>' +
    3. '<note importance="high" logged="true">' +
    4. ' <title>Play</title>' +
    5. ' <title>Happy</title>' +
    6. ' <lens>Work</lens>' +
    7. '</note>';
    8. let textEncoder = new util.TextEncoder();
    9. let arrBuffer = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码
    10. let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
  3. 自定义回调函数,本例直接打印出属性及属性值。

    1. let str = '';
    2. function func(name, value){
    3. str += name + ' ' + value + ' ';
    4. return true; // true:继续解析 false:停止解析
    5. }
  4. 设置解析选项,调用parse函数。

    1. let options = {supportDoctype:true, ignoreNameSpace:true, attributeValueCallbackFunction:func};
    2. that.parse(options);
    3. console.info(str); // 一次打印出所有的属性及其值

    输出结果如下所示:

    1. importance high logged true // note节点的属性及属性值

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

  1. 引入模块。

    1. import xml from '@ohos.xml';
    2. import util from '@ohos.util'; // 需要使用util模块函数对文件编码
  2. 对XML文件编码后调用XmlPullParser。

    1. let strXml =
    2. '<?xml version="1.0" encoding="utf-8"?>' +
    3. '<note importance="high" logged="true">' +
    4. '<title>Play</title>' +
    5. '</note>';
    6. let textEncoder = new util.TextEncoder();
    7. let arrBuffer = textEncoder.encodeInto(strXml); // 对数据编码,防止包含中文字符乱码
    8. let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
  3. 自定义回调函数,本例直接打印元素事件类型及元素深度。

    1. let str = '';
    2. function func(name, value){
    3. str = name + ' ' + value.getDepth(); // getDepth 获取元素的当前深度
    4. console.info(str)
    5. return true; //true:继续解析 false:停止解析
    6. }
  4. 设置解析选项,调用parse函数。

    1. let options = {supportDoctype:true, ignoreNameSpace:true, tokenValueCallbackFunction:func};
    2. that.parse(options);

    输出结果如下所示:

    1. 0 0 // 0:<?xml version="1.0" encoding="utf-8"?> 对应事件类型START_DOCUMENT值为0 0:起始深度为0
    2. 2 1 // 2:<note importance="high" logged="true"> 对应事件类型START_TAG值为2 1:深度为1
    3. 2 2 // 2:<title>对应事件类型START_TAG值为2 2:深度为2
    4. 4 2 // 4:Play对应事件类型TEXT值为4 2:深度为2
    5. 3 2 // 3:</title>对应事件类型END_TAG值为3 2:深度为2
    6. 3 1 // 3:</note>对应事件类型END_TAG值为3 1:深度为1(与<note对应>)
    7. 1 0 // 1:对应事件类型END_DOCUMENT值为1 0:深度为0

场景示例

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

  1. import xml from '@ohos.xml';
  2. import util from '@ohos.util';
  3. let strXml =
  4. '<?xml version="1.0" encoding="UTF-8"?>' +
  5. '<book category="COOKING">' +
  6. '<title lang="en">Everyday</title>' +
  7. '<author>Giada</author>' +
  8. '</book>';
  9. let textEncoder = new util.TextEncoder();
  10. let arrBuffer = textEncoder.encodeInto(strXml);
  11. let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
  12. let str = '';
  13. function tagFunc(name, value) {
  14. str = name + value;
  15. console.info('tag-' + str);
  16. return true;
  17. }
  18. function attFunc(name, value) {
  19. str = name + ' ' + value;
  20. console.info('attri-' + str);
  21. return true;
  22. }
  23. function tokenFunc(name, value) {
  24. str = name + ' ' + value.getDepth();
  25. console.info('token-' + str);
  26. return true;
  27. }
  28. let options = {
  29. supportDocType: true,
  30. ignoreNameSpace: true,
  31. tagValueCallbackFunction: tagFunc,
  32. attributeValueCallbackFunction: attFunc,
  33. tokenValueCallbackFunction: tokenFunc
  34. };
  35. that.parse(options);

输出结果如下所示:

  1. tag-
  2. token-0 0
  3. tag-book
  4. attri-category COOKING
  5. token-2 1
  6. tag-title
  7. attri-lang en
  8. token-2 2
  9. tag-Everyday
  10. token-4 2
  11. tag-title
  12. token-3 2
  13. tag-author
  14. token-2 2
  15. tag-Giada
  16. token-4 2
  17. tag-author
  18. token-3 2
  19. tag-book
  20. token-3 1
  21. tag-
  22. token-1 0
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号