Node.js使用xmldom获取XML属性值时报getAttribute不是函数如何解决
问题原因及解决方案
报错根因
document.getElementsByTagName("release-list") 返回的是符合匹配规则的元素集合(类数组结构),不是单个DOM元素,因此没有getAttribute方法,直接调用会抛出类型错误。
代码修复
你只需要从返回的集合中取出第一个匹配元素,再调用属性读取方法即可,同时修正代码中其他已知问题:
// Loading of necessary modules and creation of a new application. var express = require("express"); var app = express(); var request = require("request"); var DOMParser = new (require('xmldom')).DOMParser; // URL of the musicbrainz API. var root_url = "https://musicbrainz.org/ws/2/"; // 建议把异步操作封装为Promise,方便外部调用取值 function getReleases(MBID){ return new Promise((resolve, reject) => { const releases_URL = root_url + "release-group/" + MBID + "?inc=releases" request({ headers: { 'User-Agent': 'my-musicbrainz-client', }, url: releases_URL, json: false }, function (error, response, body) { if (!error && response.statusCode === 200) { const document = DOMParser.parseFromString(body); // 取出集合中第一个匹配的元素 const releaseList = document.getElementsByTagName("release-list")[0] const count = releaseList.getAttribute('count') console.log("COUNT:"+ count) resolve(count) }else{ console.log("ERROR IN FUNCTION") reject(error || new Error('请求失败')) } }) }) } // 外部调用示例 // getReleases('0da580f2-6768-498f-af9d-2becaddf15e0').then(count => console.log('拿到的count值:', count))
其他获取属性的方式
- 可以使用
xml2js包直接把XML整体转为JSON对象,直接读取嵌套属性即可,不用操作DOM,更适合简单场景的属性提取 - 也可以使用xpath语法直接定位元素,精准度更高,适合XML结构复杂的场景
内容的提问来源于stack exchange,提问作者Lorena A.
相关产品推荐
相关产品推荐

