【问题标题】:Getting the value of a Key from a JSON response which is made by parsing XML从通过解析 XML 生成的 JSON 响应中获取 Key 的值
【发布时间】:2020-01-16 23:32:22
【问题描述】:

我正在尝试解析来自 URL 的 XML 响应并将其转换为 JSON,解析后的响应有很多不需要的数据,但是我只需要属性“TEXT”的值

尝试通过调用 output = JSON.stringify(result); 来获取密钥并返回 return output['TEXT'];但它给出了一个未定义的错误。

var parseString = require('xml2js').parseString;

function parse()
{

http.get('http://data.alexa.com/data?cli=10&url=https://google.com', 
(resp) => {
let data = '';
// A chunk of data has been recieved.
resp.on('data', (chunk) => {
    data += chunk;
});
// The whole response has been received. Print out the result.
resp.on('end', () => {

//console.log(JSON.parse(data).explanation);
    parseString(data, function (err, result) {
        console.log(JSON.stringify(result));
            output = JSON.stringify(result);

             });
});
}).on("error", (err) => {
console.log("Error: " + err.message);
});

return output['TEXT'];
}

这是解析函数返回的完整 JSON,我认为它无效。我试图在“流行”中获取“文本”值

{"ALEXA":{"$": 
   {"VER":"0.9","URL":"google.com/","HOME":"0","AID":"=","IDN":                                        
   "buymeacoffee.com/"},"SD":[{"POPULARITY":[{"$": 
   {"URL":"google.com/","TEXT"                                        
   :"20242","SOURCE":"panel"}}],"REACH":[{"$":{"RANK":"25887"}}],"RANK": 
   [{"$": 
   {"DEL                                        TA":"-21167"}}],"COUNTRY": 
   [{"$":{"CODE":"US","NAME":"United States","RANK":"2093                                        
   5"}}]}]}}

【问题讨论】:

  • 如果你想访问对象的属性,你想通过JSON.stringify()把它变成一个字符串
  • 另外,由于 HTTP 请求的异步特性,您不能在 parse() 的末尾返回 output。鉴于您当前的代码,我建议将回调传递给parse(),您可以使用解析出的数据调用它,例如callback(result.ALEXA.SD[0].POPULARITY[0].$.TEXT)

标签: javascript node.js json


【解决方案1】:

关于你在这里做错了什么:

  • 您不需要对parseString 的结果进行字符串化。它已经是一个对象,您可以按原样使用它。

  • 如果你想访问text,你可以通过result['ALEXA']['SD']['POPULARITY']['$']['TEXT']来实现

或者:

您可以尝试使用camaro。它是专门为此目的而制作的:将 xml 转换为 json 并且只获取您感兴趣的属性。

const { transform } = require('camaro')

const xml = `

<?xml version="1.0" encoding="UTF-8"?>

<!-- Need more Alexa data?  Find our APIs here: https://aws.amazon.com/alexa/ -->
<ALEXA VER="0.9" URL="google.com/" HOME="0" AID="=" IDN="google.com/">
<SD><POPULARITY URL="google.com/" TEXT="1" SOURCE="panel"/><REACH RANK="1"/><RANK DELTA="+0"/><COUNTRY CODE="US" NAME="United States" RANK="1"/></SD></ALEXA>
`

;(async function () {
    const template = {
        text: 'ALEXA/SD/POPULARITY/@TEXT'
    }

    const result = await transform(xml, template)

    console.log(JSON.stringify(result, null, 4));

})()

输出:

{
    "text": "1"
}

您想要的 text 属性可通过使用 result.text 访问

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多