在 NodeJS 中解析 XML
XML 代表可擴充套件標記語言。它是一種簡單的基於文字的格式,旨在儲存和傳輸資料。
在 NodeJS 中使用 XML 解析
XML 解析是讀取和修改 XML
資料的過程,以便客戶端應用程式可以有效地處理資料。
除了讀取 XML
文件外,解析器還驗證給定的 XML
文件是否符合標準 XML
語法並檢查任何文件違規或錯誤。
解析器通過檢查和驗證 XML 文件的元件是否符合 文件型別定義 (DTD)
或模式模式來執行此驗證。
我們可以用來解析 XML 的常用且直接的庫之一是 xml2js
。它是一個簡單的雙向 XML 到 javascript 物件轉換器,使用 sax-js
和 xmlbuilder-js
。
安裝 xml2js
及其所有依賴項的最快和最直接的方法是使用 node package manager(npm)
使用以下命令。
npm install xml2js
我們將首先使用 index.js
檔案建立一個骨架節點應用程式伺服器來編寫我們的程式碼。
由於我們已將 xml2js
作為單獨的模組安裝,我們將使用 require()
函式將其包含在主檔案 index.js
中,並將其作為 package.json
中登記的依賴項之一檔案。
一旦模組到位,我們就可以公開 Parse 物件並解析 XML 檔案。下面的程式碼顯示我們可以將它們解析為小的 XML 檔案。
var parseString = require('xml2js').parseString;
var xml = "<root><railroad><gate>mile</gate><actually><wall>about</wall><whether>whom</whether><generally>choose</generally><alive>-110838449.82186222</alive><dug>1150240574</dug><keep>1763043002.325139</keep></actually><hello>flower</hello><strike>-914757363.3499522</strike><danger>-200144457</danger> <whose>1022707429</whose></railroad><stove>1072975804</stove><row>-1686689624.6101847</row><changing>96738623.18869686</changing><compass>917572500</compass><die>suggest</die></root>"
parseString(xml, function (err, result) {
console.dir(result);
});
輸出:
root: {
railroad: [ [Object] ],
stove: [ '1072975804' ],
row: [ '-1686689624.6101847' ],
changing: [ '96738623.18869686' ],
compass: [ '917572500' ],
die: [ 'suggest' ]
}
}
但是,如果我們編寫生產標準程式碼,這可能不是為大檔案解析 XML 的理想方法。我們可以使用 fs.readFileSync()
在使用 fs
模組解析 XML 檔案之前同步讀取它。
fs.readFileSync()
是 fs 模組的內建 API,可同步返回檔案的內容。一旦我們有了檔案,我們就可以使用解析的物件來解析檔案,如下所示。
使用解析物件解析檔案
const xml2js = require('xml2js');
const fs = require('fs');
const parser = new xml2js.Parser({ attrkey: "ATTR" });
let xml_file = fs.readFileSync("file.xml", "utf8");
parser.parseString(xml_file, (error, result) => {
if(error === null) {
console.log(result);
}
else {
console.log(error);
}
});
輸出:
{
root: {
railroad: [ [Object] ],
stove: [ '1072975804' ],
row: [ '-1686689624.6101847' ],
changing: [ '96738623.18869686' ],
compass: [ '917572500' ],
die: [ 'suggest' ]
}
}
我們也可以非同步讀取檔案,然後解析,如下面的程式碼所示。
const xml2js = require('xml2js');
const fs = require('fs');
const parser = new xml2js.Parser({ attrkey: "ATTR" });
fs.readFile('file.xml', (err,data) => {
if(!err) {
parser.parseString(data, function(error, result) {
if(error === null) {
console.log(result);
}
else {
console.log(error);
}
});
}
});
輸出:
{
root: {
railroad: [ [Object] ],
stove: [ '1072975804' ],
row: [ '-1686689624.6101847' ],
changing: [ '96738623.18869686' ],
compass: [ '917572500' ],
die: [ 'suggest' ]
}
}
假設這個 XML 資料的來源是一個特定的端點。然後,在這種情況下,我們首先需要向該特定端點傳送一個 HTTP GET
請求。
如下所示,該端點的響應將被傳遞給 xml2js
Parse 物件進行解析。
const https = require('https');
const xml2js = require('xml2js');
const parser = new xml2js.Parser({ attrkey: "ATTR" });
let req = https.get("https://4f567984-6c81-4a85-8b5a-61ab9621f67f.mock.pstmn.io/dishon/file.xml", function(res) {
let xml_data = '';
res.on('data', (stream) => {
xml_data = xml_data + stream;
});
res.on('end', () => {
parser.parseString(xml_data, (error, result) => {
if(error === null) {
console.log(result);
}
else {
console.log(error);
}
});
});
});
輸出:
{
root: {
railroad: [ [Object] ],
stove: [ '1072975804' ],
row: [ '-1686689624.6101847' ],
changing: [ '96738623.18869686' ],
compass: [ '917572500' ],
die: [ 'suggest' ]
}
}
Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.
LinkedIn