【问题标题】:Parsing XML file using only built-in JavaScript functions仅使用内置 JavaScript 函数解析 XML 文件
【发布时间】:2019-11-30 22:21:46
【问题描述】:

我是编码初学者,我正在尝试使用 JavaScript 解析 XML 文件 hosted on GitHub,以提取例如嵌套在 <book id="bk102"> 节点中的 <author> 节点中包含的信息.

我知道 Stackoverflow 中有几个类似的问题,我阅读了其中很多,但我想做的是仅使用内置的 JavaScript 函数从上述 XML 文件中提取数据。

老实说,我什至不知道这是否可能,但我会更详细地解释一下我尝试做的事情,以便为您提供全貌。

为什么我只能使用 JS 内置函数?

我正在使用名为Fulcrum 的数据收集平台开发动态调查表。

Fulcrum 允许在其'Data events' module 中编写 JavaScript 代码(带有一些自定义函数),以便与调查表本身中包含的字段和计算进行交互。

Fulcrum 中的“数据事件”模块不允许我安装其他软件包。出于这个原因,我无法安装,例如xml-js 库,如建议的here 那样使用内置的JavaScript JSON 函数,或者我不能使用DOMParser() 接口等,因为Fulcrum 无法识别它.

我从哪里开始?

阅读 Fulcrum 文档,我发现我可以使用custom function called 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),但我真的不知道如何仅提取嵌套在<book id="bk102"> 节点中的<author> 节点中包含的信息。

任何关于如何进行的建议都会非常有帮助。谢谢你,斯特凡诺。


编辑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);
      }
    }
  });
});

在您看来,这是否可以以更好、更有效的方式完成?

【问题讨论】:

  • 您真的不想以这种方式“手动解析”XML。例如,如果 book 元素中有不同的空格,或者“id”属性之前有另一个属性,或者该属性是单引号而不是双引号,您的代码将失败。它今天可能有效,但明年可能不会有效。

标签: javascript xml xml-parsing


【解决方案1】:

您说过您可以编写 Javascript 代码,但您不能安装额外的 Javascript 包。所以答案是下载一个用 Javascript 编写的开源 XML 解析器,并将其添加到您的代码中,就好像它是您自己编写的代码的一部分一样。

【讨论】:

  • 感谢@Michael Kay 的建议,不过我真的是个初学者,能否请您提供一些有关如何执行此操作的详细信息?您对用 Javascript 编写的开源 XML 解析器有什么建议吗?
  • 我只能为你指明正确的方向,我不会一路带领你到达目的地。我们使用从 github/isaacs/sax-js 派生的解析器,但是在过去几年中出现了很多其他的解析器,我不知道我们今天是否会做出同样的选择。
  • 好的,谢谢,我明白了。老实说,我还没有找到一种方法来完成我想做的事情。查看用 JS 编写的 XML 解析器,我发现它们在不同的文件夹中构造,我不知道如何“安装”它们,因为 Fulcrum 只允许我在空白页上编写代码,当我粘贴代码时,我发现 @987654321 @,例如,我得到了很多错误。 This 与我在 Fulcrum 中被允许做的事情很接近,但不幸的是我无法让它工作。
  • 我不知道 Fulcrum,但要么必须有一种简单的方法来做到这一点,要么它距离其“让移动数据收集变得简单”的说法相距一百万英里。但我总是对任何声称“不需要编码”的产品保持警惕。这通常意味着您只能做产品供应商希望您做的事情,而不是您想做的事情。
  • 也许我遗漏了什么,我是土木工程师而不是开发人员,所以很有可能。我会做一些额外的研究,如果我有任何消息,我会在这里更新问题。非常感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
相关资源
最近更新 更多