XML解析

2024-02-16 13:48 更新

對(duì)于以XML作為載體傳遞的數(shù)據(jù),實(shí)際使用中需要對(duì)相關(guān)的節(jié)點(diǎn)進(jìn)行解析,一般包括解析XML標(biāo)簽和標(biāo)簽值解析XML屬性和屬性值、解析XML事件類(lèi)型和元素深度三類(lèi)場(chǎng)景。

XML模塊提供XmlPullParser類(lèi)對(duì)XML文件解析,輸入為含有XML文本的ArrayBuffer或DataView,輸出為解析得到的信息。

表1 XML解析選項(xiàng)

名稱(chēng)

類(lèi)型

必填

說(shuō)明

supportDoctype

boolean

是否忽略文檔類(lèi)型。默認(rèn)為false,表示對(duì)文檔類(lèi)型進(jìn)行解析。

ignoreNameSpace

boolean

是否忽略命名空間。默認(rèn)為false,表示對(duì)命名空間進(jìn)行解析。

tagValueCallbackFunction

(name: string, value: string) => boolean

獲取tagValue回調(diào)函數(shù),打印標(biāo)簽及標(biāo)簽值。默認(rèn)為null,表示不進(jìn)行XML標(biāo)簽和標(biāo)簽值的解析。

attributeValueCallbackFunction

(name: string, value: string) => boolean

獲取attributeValue回調(diào)函數(shù), 打印屬性及屬性值。默認(rèn)為null,表示不進(jìn)行XML屬性和屬性值的解析。

tokenValueCallbackFunction

(eventType: EventType, value: ParseInfo) => boolean

獲取tokenValue回調(diào)函數(shù),打印標(biāo)簽事件類(lèi)型及parseInfo對(duì)應(yīng)屬性。默認(rèn)為null,表示不進(jìn)行XML事件類(lèi)型解析。

注意事項(xiàng)

  • XML解析及轉(zhuǎn)換需要確保傳入的XML數(shù)據(jù)符合標(biāo)準(zhǔn)格式。

  • XML解析目前不支持按指定節(jié)點(diǎn)解析對(duì)應(yīng)的節(jié)點(diǎn)值。

解析XML標(biāo)簽和標(biāo)簽值

  1. 引入模塊。

    1. import xml from '@ohos.xml';
    2. import util from '@ohos.util'; // 需要使用util模塊函數(shù)對(duì)文件編碼
  2. 對(duì)XML文件編碼后調(diào)用XmlPullParser。

    可以基于ArrayBuffer構(gòu)造XmlPullParser對(duì)象, 也可以基于DataView構(gòu)造XmlPullParser對(duì)象。

    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); // 對(duì)數(shù)據(jù)編碼,防止包含中文字符亂碼
    9. // 1.基于ArrayBuffer構(gòu)造XmlPullParser對(duì)象
    10. let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
    11. // 2.基于DataView構(gòu)造XmlPullParser對(duì)象
    12. let dataView = new DataView(arrBuffer.buffer);
    13. let that = new xml.XmlPullParser(dataView, 'UTF-8');
  3. 自定義回調(diào)函數(shù),本例直接打印出標(biāo)簽及標(biāo)簽值。

    1. let str = '';
    2. function func(name, value){
    3. str = name + value;
    4. console.info(str);
    5. return true; //true:繼續(xù)解析 false:停止解析
    6. }
  4. 設(shè)置解析選項(xiàng),調(diào)用parse函數(shù)。

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

    輸出結(jié)果如下所示:

    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模塊函數(shù)對(duì)文件編碼
  2. 對(duì)XML文件編碼后調(diào)用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); // 對(duì)數(shù)據(jù)編碼,防止包含中文字符亂碼
    10. let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
  3. 自定義回調(diào)函數(shù),本例直接打印出屬性及屬性值。

    1. let str = '';
    2. function func(name, value){
    3. str += name + ' ' + value + ' ';
    4. return true; // true:繼續(xù)解析 false:停止解析
    5. }
  4. 設(shè)置解析選項(xiàng),調(diào)用parse函數(shù)。

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

    輸出結(jié)果如下所示:

    1. importance high logged true // note節(jié)點(diǎn)的屬性及屬性值

解析XML事件類(lèi)型和元素深度

  1. 引入模塊。

    1. import xml from '@ohos.xml';
    2. import util from '@ohos.util'; // 需要使用util模塊函數(shù)對(duì)文件編碼
  2. 對(duì)XML文件編碼后調(diào)用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); // 對(duì)數(shù)據(jù)編碼,防止包含中文字符亂碼
    8. let that = new xml.XmlPullParser(arrBuffer.buffer, 'UTF-8');
  3. 自定義回調(diào)函數(shù),本例直接打印元素事件類(lèi)型及元素深度。

    1. let str = '';
    2. function func(name, value){
    3. str = name + ' ' + value.getDepth(); // getDepth 獲取元素的當(dāng)前深度
    4. console.info(str)
    5. return true; //true:繼續(xù)解析 false:停止解析
    6. }
  4. 設(shè)置解析選項(xiàng),調(diào)用parse函數(shù)。

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

    輸出結(jié)果如下所示:

    1. 0 0 // 0:<?xml version="1.0" encoding="utf-8"?> 對(duì)應(yīng)事件類(lèi)型START_DOCUMENT值為0 0:起始深度為0
    2. 2 1 // 2:<note importance="high" logged="true"> 對(duì)應(yīng)事件類(lèi)型START_TAG值為2 1:深度為1
    3. 2 2 // 2:<title>對(duì)應(yīng)事件類(lèi)型START_TAG值為2 2:深度為2
    4. 4 2 // 4:Play對(duì)應(yīng)事件類(lèi)型TEXT值為4 2:深度為2
    5. 3 2 // 3:</title>對(duì)應(yīng)事件類(lèi)型END_TAG值為3 2:深度為2
    6. 3 1 // 3:</note>對(duì)應(yīng)事件類(lèi)型END_TAG值為3 1:深度為1(與<note對(duì)應(yīng)>)
    7. 1 0 // 1:對(duì)應(yīng)事件類(lèi)型END_DOCUMENT值為1 0:深度為0

場(chǎng)景示例

此處以調(diào)用所有解析選項(xiàng)為例,提供解析XML標(biāo)簽、屬性和事件類(lèi)型的開(kāi)發(fā)示例。

  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);

輸出結(jié)果如下所示:

  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
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)