【发布时间】: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