簡體   English   中英

僅使用內置 JavaScript 函數解析 XML 文件

[英]Parsing XML file using only built-in JavaScript functions

我是編碼初學者,我正在嘗試使用 JavaScript 解析托管在 GitHub 上的 XML 文件,以提取例如嵌套在<book id="bk102">中的<author>節點中包含的信息<book id="bk102">節點。

我知道 Stackoverflow 中有幾個類似的問題,我閱讀了很多,但我想要做的是僅使用內置的 JavaScript 函數從上述 XML 文件中提取數據。

老實說,我不知道這是否可能,但我會更詳細地解釋我試圖做的事情,以便為您提供全貌。

為什么我只能使用JS內置函數?

我正在使用名為Fulcrum的數據收集平台開發動態調查表。

Fulcrum 允許在其“數據事件”模塊中編寫 JavaScript 代碼(帶有一些自定義函數),以便與調查表單本身中包含的字段和計算進行交互。

Fulcrum 中的“數據事件”模塊不允許我安裝其他軟件包。 出於這個原因,我無法安裝,例如, 這里建議的xml-js庫,以使用內置的 JavaScript JSON 函數,或者我無法使用DOMParser()接口等,因為 Fulcrum 無法識別它。

我從哪里開始?

閱讀 Fulcrum 文檔后,我發現我可以使用一個名為 REQUEST自定義函數,並參考了以下示例。 Fulcrum 自定義函數用大寫字母標識。

// This example looks up the place name from OpenStreetMap when the location changes and fills in a text
// field with the place name. Replace 'place_name' below with a text field on your form.

ON('change-geometry', function(event) {
  var options = {
    url: 'https://nominatim.openstreetmap.org/search/' + LATITUDE() + ',' + LONGITUDE(),
    qs: {
      format: 'json',
      polygon: 1,
      addressdetails: 1
    }
  };

  REQUEST(options, function(error, response, body) {
    if (error) {
      ALERT('Error with request: ' + INSPECT(error));
    } else {
      var data = JSON.parse(body);
      if (data.length) {
        SETVALUE('place_name', data[0].display_name);
      }
    }
  });
});

這里唯一的問題是這個例子從一個 JSON 文件中讀取,而我需要從一個 XML 文件中讀取。

我嘗試了什么?

我嘗試編輯示例中的函數以使其適用於 XML 文件。 我就是這樣修改的。

ON('click', 'import_xml', function(event) {
  var options = {
    url: 'https://gist.githubusercontent.com/Ram-N/5189462/raw/46db0b43ad7bf9cbd32a8932f3ab981bd4b4da7c/books.xml',
    qs: {
      format: 'xml'
    }
  };

  REQUEST(options, function(error, response, body) {
    if (error) {
      ALERT('Error with request: ' + INSPECT(error));
    } else {
      var data = body;
      if (data.length) {
        SETVALUE('test_field_xml', data);
      }
    }
  });
});

它有效! 部分...當我單擊import_xml超鏈接(請參閱下面的 1)時,我可以在test_field_xml字段中導入整個 XML 文件(請參閱下面的 2),但我真的不知道如何只提取<author>節點中包含的信息嵌套在<book id="bk102">節點中。

在此處輸入圖片說明

關於如何進行的任何建議都會非常有幫助。 謝謝你,斯特凡諾。


編輯1:

我想我找到了一個非常“自制”的部分解決方案,也不是很實用或很好,但它有效。 我編輯了上面的代碼,如下所示:

ON('click', 'import_xml', function(event) {
  var options = {
    url: 'https://gist.githubusercontent.com/Ram-N/5189462/raw/46db0b43ad7bf9cbd32a8932f3ab981bd4b4da7c/books.xml',
    qs: {
      format: 'xml'
    }
  };

  REQUEST(options, function(error, response, body) {
    if (error) {
      ALERT('Error with request: ' + INSPECT(error));
    } else {
      var data = body;
      var test1 = body.substring(
            body.lastIndexOf('<book id="bk102">') + 24, 
            body.lastIndexOf('<book id="bk103">') - 15
        );
      var test2 = test1.substring(
            test1.lastIndexOf('<author>') + 8, 
            test1.lastIndexOf('</author>') - 0
        );     
      if (data.length) {
        SETVALUE('test_field_xml', test2);
      }
    }
  });
});

在您看來,這可以以更好、更有效的方式完成嗎?

您說過您可以編寫 Javascript 代碼,但不能安裝其他 Javascript 包。 因此,答案是下載一個用 Javascript 編寫的開源 XML 解析器,並將其添加到您的代碼中,就好像它是您自己編寫的代碼的一部分一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM