从node调用的restful api方法提供以下xml响应:
<?xml version="1.0" encoding="UTF-8"?>
<tsResponse xmlns="http://tableausoftware.com/api" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tableausoftware.com/api http://tableausoftware.com/api/ts-api-2.0.xsd">
<credentials token="xyzzy">
<site contentUrl=""/>
</credentials>
</tsResponse>
我的最终目标是获取与credentials元素相关联的token属性的值,并将其分配给“我的第一个节点应用程序”中的变量。
我的第一个尝试是使用一个名为xml2js的模块。我可以将上面的响应转换为js对象,但是我花了很长时间才弄清楚剩下的内容。
我成功地完成了我的目标,但我真的不明白我是怎么做到的……这完全是我的一种尝试和错误,真的:
var parseString = require('xml2js').parseString;
...
parseString(response, function (err, result) {
console.log(util.inspect(result, false, 7));
tokencontainer = (result.tsResponse.credentials);
token = tokencontainer[0].$.token;
});
util.inspect的输出如下:
{ tsResponse:
{ '$':
{ xmlns: 'http://tableausoftware.com/api',
'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
'xsi:schemaLocation': 'http://tableausoftware.com/api http://tableausoftware.com/api/ts-api-2.0.xsd' },
credentials:
[ { '$': { token: 'xyzzy' },
site: [ { '$': { contentUrl: '' } } ] } ] } }
有人能解释一下这到底是什么意思吗?尽管我只是在玩这个游戏,但我想知道我在看什么。例如:
如何引用xsi:schemalocation属性(或者它是
钥匙?)在JS?
我相信我可以在
比我想象的简洁时尚。怎么用?
那些美元符号是干什么的?它们意味着什么?
……当然,如果有比使用xml2js更好的方法,我会全神贯注的。不过,我还是想知道上面发生了什么,因为这对我来说是新的…
多谢
最佳答案
您可以访问xsi:schemalocation
作为result.tsResponse.$['xsi:schemalocation']
。
以下是javascript对象文本语法的基本知识。像
x = {
a: 5,
b: 6
}
有两个属性,
x.a
(即5)和x.b
(即6)。属性本身可以是对象:outerObject = {
innerObject: {a: 5}
}
则
outerObject.innerObject.a
为5。方括号表示数组:
object = {
includedArray: ['a', 'b', 'c']
}
object.includedArray[1]
是“b”。属性名可以使用引号或不使用引号,因此
{'a': 5}
和{a: 5}
是相同的。如果名称不是有效的javascript标识符,则需要包含引号。属性可以作为obj.propertyName
或obj['propertyName']
访问,但如果属性名不是js标识符,则必须使用后者。所以,总而言之:
result.tsResponse.$['xsi:schemalocation']
-首先我们进入tsResponse
对象,然后进入$
对象(令人惊讶的是,$
是一个有效的js标识符),并获取xsi:schemalocation
属性(xsi:schemalocation
不是一个有效的标识符,因为冒号)。您可能会发现
console.log(JSON.stringify(object, null, 2))
的输出比util.inspect
更容易阅读。您还可以获得标记
result.tsResponse.credentials[0].$.token
,这基本上与您编写的内容相同,而不需要临时变量。不幸的是,仅仅使用xml2js是无法比这更好的。关于xml2js:
xml2js使用“$”属性名来表示xml属性,因此
<element attr1="a" attr2="b">
会变成包含$: {attr1: 'a', attr2: 'b'}
的东西。他们可以选择任何其他名称,但他们选择了$,因为它是无效的XML元素名称(保证没有冲突),而且可以快速键入。默认情况下,xml2js将嵌套对象放入数组中。例子:
<element> <a>5</a> <a>6</a> <b>7</b> </element>
变成
{a: ['5', '6'], b: ['7']}
。注意b
也变成了一个数组,尽管只有一个。如果您查看xml2js文档,您将找到一个选项,在只有一个数组时排除该数组,这样您将得到{a: ['5', '6'], b: '7'}
,这有时更容易处理,有时更复杂。关于javascript - 了解util.inspect的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22975671/