在 NodeJS 中解析 XML

Isaac Tony 2023年10月12日
  1. 在 NodeJS 中使用 XML 解析
  2. 使用解析物件解析檔案
在 NodeJS 中解析 XML

XML 代表可擴充套件標記語言。它是一種簡單的基於文字的格式,旨在儲存和傳輸資料。

在 NodeJS 中使用 XML 解析

XML 解析是讀取和修改 XML 資料的過程,以便客戶端應用程式可以有效地處理資料。

除了讀取 XML 文件外,解析器還驗證給定的 XML 文件是否符合標準 XML 語法並檢查任何文件違規或錯誤。

解析器通過檢查和驗證 XML 文件的元件是否符合 文件型別定義 (DTD) 或模式模式來執行此驗證。

我們可以用來解析 XML 的常用且直接的庫之一是 xml2js。它是一個簡單的雙向 XML 到 javascript 物件轉換器,使用 sax-jsxmlbuilder-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
Isaac Tony avatar Isaac Tony avatar

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