使用xml2js庫進(jìn)行XML數(shù)據(jù)解析
引言
解析XML文件是開發(fā)中常見的需求之一。為了以一種簡(jiǎn)單易用的方式訪問XML數(shù)據(jù),你可能不想編譯一個(gè)C解析器,而是想尋找一個(gè)更方便的解決方案。那么,xml2js就是你需要的工具!xml2js是一個(gè)簡(jiǎn)單的XML到JavaScript對(duì)象轉(zhuǎn)換器,支持雙向轉(zhuǎn)換。它使用了sax-js和xmlbuilder-js這兩個(gè)工具庫。
安裝
最簡(jiǎn)單的安裝xml2js的方式是使用npm。只需執(zhí)行npm install xml2js
,npm將會(huì)下載xml2js及其所有依賴。
xml2js也可以通過Bower進(jìn)行安裝,只需執(zhí)行bower install xml2js
,Bower將會(huì)下載xml2js及其所有依賴。
用法
由于你是一位非常聰明的開發(fā)者,所以不需要過多的教程指導(dǎo)。解析XML應(yīng)該是一件簡(jiǎn)單的事情,我們直接通過一些示例進(jìn)行學(xué)習(xí)。
簡(jiǎn)短用法
你希望盡可能簡(jiǎn)單、輕松地解析XML嗎?使用以下代碼:
var parseString = require('xml2js').parseString; var xml = "<root>Hello xml2js!</root>" parseString(xml, function (err, result) { console.dir(result); });
這真是再簡(jiǎn)單不過了,對(duì)吧?這個(gè)方法適用于xml2js的0.2.3版本及以上。使用CoffeeScript時(shí),代碼如下:
CoffeeScript 可能比較小眾,但是官方文檔有舉例了相關(guān)內(nèi)容,故本文進(jìn)行保留。
{parseString} = require 'xml2js' xml = "<root>Hello xml2js!</root>" parseString xml, (err, result) -> console.dir result
如果你需要一些特殊的選項(xiàng),也不用擔(dān)心,xml2js支持許多選項(xiàng)(見下文),你可以將這些選項(xiàng)作為第二個(gè)參數(shù)進(jìn)行指定:
parseString(xml, {trim: true}, function (err, result) { });
實(shí)例方法
如果你之前一直使用xml-simple或者自己封裝的方法來處理XML,那么從0.1.11版本開始,xml2js為你添加了以下方法:
var fs = require('fs'), xml2js = require('xml2js'); var parser = new xml2js.Parser(); fs.readFile(__dirname + '/foo.xml', function(err, data) { parser.parseString(data, function (err, result) { console.dir(result); console.log('Done'); }); });
看吧,沒有事件監(jiān)聽器!
你還可以使用CoffeeScript來進(jìn)一步減少代碼的冗余:
fs = require 'fs', xml2js = require 'xml2js' parser = new xml2js.Parser() fs.readFile __dirname + '/foo.xml', (err, data) -> parser.parseString data, (err, result) -> console.dir result console.log 'Done.'
但是,如果你忘記使用new
關(guān)鍵字創(chuàng)建一個(gè)新的Parser
對(duì)象會(huì)怎么樣?從0.2.8開始,你也可以不使用這個(gè)關(guān)鍵字。從0.2.8開始,你可以不使用它,在這種情況下,xml2js會(huì)幫助你添加它,以保證不會(huì)再出現(xiàn)意外和莫名其妙的bug!
Promise 用法
var xml2js = require('xml2js'); var xml = '<foo></foo>'; // 1. With parser var parser = new xml2js.Parser(/* options */); parser.parseStringPromise(xml).then(function (result) { console.dir(result); console.log('Done'); }) .catch(function (err) { // Failed }); // 2. Without parser xml2js.parseStringPromise(xml /*, options */).then(function (result) { console.dir(result); console.log('Done'); }) .catch(function (err) { // Failed });
- 使用解析器進(jìn)行解析:通過創(chuàng)建xml2js解析器的實(shí)例,調(diào)用解析器的
parseStringPromise
方法對(duì)XML數(shù)據(jù)進(jìn)行解析,并通過.then()
方法處理解析成功的結(jié)果,通過.catch()
方法處理解析過程中的錯(cuò)誤。 - 不使用解析器直接解析:直接調(diào)用xml2js庫的
parseStringPromise
方法對(duì)XML數(shù)據(jù)進(jìn)行解析,通過.then()
方法處理解析成功的結(jié)果,通過.catch()
方法處理解析過程中的錯(cuò)誤。這種方法省去了創(chuàng)建解析器實(shí)例的步驟,直接調(diào)用庫函數(shù)進(jìn)行解析。
使用 XML 構(gòu)建器
自 0.4.0 版本起,xml2js 還支持使用對(duì)象來構(gòu)建 XML。下面是一個(gè)示例:
const xml2js = require('xml2js'); const obj = {name: "Super", Surname: "Man", age: 23}; const builder = new xml2js.Builder(); const xml = builder.buildObject(obj);
上述代碼將生成如下的 XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <root> <name>Super</name> <Surname>Man</Surname> <age>23</age> </root>
通過設(shè)置 cdata
選項(xiàng)為 true
,可以支持寫入 CDATA。
指定屬性
使用 xml2js,你可以指定 XML 元素的屬性。下面是一個(gè)示例:
const xml2js = require('xml2js'); const obj = {root: {$: {id: "my id"}, _: "my inner text"}}; const builder = new xml2js.Builder(); const xml = builder.buildObject(obj);
上述代碼將生成如下的 XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <root id="my id">my inner text</root>
添加 xmlns 屬性
xml2js 還支持在生成的 XML 中添加 XML 命名空間前綴和 URI 對(duì),通過使用 xmlns
屬性。
在根元素上聲明默認(rèn)命名空間的示例:
const obj = { Foo: { $: { "xmlns": "http://foo.com" } } };
通過調(diào)用 buildObject(obj)
方法,將生成以下 XML:
<Foo xmlns="http://foo.com"/>
在非根元素上聲明非默認(rèn)命名空間的示例:
const obj = { 'foo:Foo': { $: { 'xmlns:foo': 'http://foo.com' }, 'bar:Bar': { $: { 'xmlns:bar': 'http://bar.com' } } } };
通過調(diào)用 buildObject(obj)
方法,將生成以下 XML:
<foo:Foo xmlns:foo="http://foo.com"> <bar:Bar xmlns:bar="http://bar.com"/> </foo:Foo>
處理屬性、標(biāo)簽名和值
自 0.4.1 版本起,你可以選擇提供解析器的屬性名和標(biāo)簽名處理器,以及元素值處理器(自 0.4.14 版本起,還可以提供屬性值處理器)。
下面是一個(gè)示例,演示如何將屬性名和標(biāo)簽名轉(zhuǎn)換為大寫:
function nameToUpperCase(name) { return name.toUpperCase(); } // 將所有屬性和標(biāo)簽名及其值轉(zhuǎn)換為大寫 parseString(xml, { tagNameProcessors: [nameToUpperCase], attrNameProcessors: [nameToUpperCase], valueProcessors: [nameToUpperCase], attrValueProcessors: [nameToUpperCase] }, function (err, result) { // 處理后的數(shù)據(jù) });
tagNameProcessors
和 attrNameProcessors
選項(xiàng)接受一個(gè)函數(shù)數(shù)組,函數(shù)的簽名如下:
function (name) { // 對(duì) `name` 做一些處理 return name; }
attrValueProcessors
和 valueProcessors
選項(xiàng)接受一個(gè)函數(shù)數(shù)組,函數(shù)的簽名如下:
function (value, name) { // `name` 將是節(jié)點(diǎn)名或?qū)傩悦? // 對(duì) `value` 做一些處理,可以根據(jù)節(jié)點(diǎn)或?qū)傩悦远x處理方式 return value; }
xml2js 提供了一些內(nèi)置的處理器,可以在 lib/processors.js
文件中找到:
normalize
:將名稱轉(zhuǎn)換為小寫(當(dāng)options.normalize
設(shè)置為true
時(shí)自動(dòng)使用)firstCharLowerCase
:將首字母轉(zhuǎn)換為小寫。例如,'MyTagName' 變?yōu)?'myTagName'stripPrefix
:去除 XML 命名空間前綴。例如,<foo:Bar/>
將變?yōu)?'Bar'(注意:xmlns 前綴不會(huì)被去除)parseNumbers
:將類似整數(shù)的字符串解析為整數(shù),將類似浮點(diǎn)數(shù)的字符串解析為浮點(diǎn)數(shù)。例如,"0" 變?yōu)?0,"15.56" 變?yōu)?15.56parseBooleans
:將類似布爾值的字符串解析為布爾值。例如,"true" 變?yōu)?true,"false" 變?yōu)?false
xml2js 提供了強(qiáng)大的功能,使得在 Node.js 應(yīng)用程序中解析和構(gòu)建 XML 變得簡(jiǎn)單而靈活。無論你是需要解析復(fù)雜的 XML 文檔,還是需要構(gòu)建自定義的 XML 輸出,xml2js 都是一個(gè)值得嘗試的工具。
參考文檔:
js: XML to JavaScript object converter.
以上就是使用xml2js庫進(jìn)行XML數(shù)據(jù)解析的詳細(xì)內(nèi)容,更多關(guān)于xml2js解析XML數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
微信小程序 ES6Promise.all批量上傳文件實(shí)現(xiàn)代碼
這篇文章主要介紹了微信小程序 ES6Promise.all批量上傳文件實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04微信小程序 ecshop地址三級(jí)聯(lián)動(dòng)實(shí)現(xiàn)實(shí)例代碼
這篇文章主要介紹了微信小程序 ecshop地址3級(jí)聯(lián)動(dòng)實(shí)現(xiàn)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02Qiankun Sentry 監(jiān)控異常上報(bào)無法自動(dòng)區(qū)分項(xiàng)目解決
這篇文章主要為大家介紹了Qiankun Sentry 監(jiān)控異常上報(bào)無法自動(dòng)區(qū)分項(xiàng)目解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11前端自動(dòng)化測(cè)試之Jest?進(jìn)階教程示例
這篇文章主要為大家介紹了前端自動(dòng)化測(cè)試之Jest?進(jìn)階教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02前端canvas中物體邊框和控制點(diǎn)的實(shí)現(xiàn)示例
這篇文章主要為大家介紹了前端canvas中物體邊框和控制點(diǎn)的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08