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>
我的最终目标是获取与凭据元素相关联的令牌属性的值,并将其分配给&#34;我的第一个节点应用中的变量&# 34 ;.
我首先尝试使用名为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: '' } } ] } ] } }
有人可以向我解释这实际意味着什么吗?即使我只是为了踢球而玩这个,我想要明白我在看什么。例如:
...当然,如果有更好的方法来解决这个问题,而不是使用xml2js,那我就是所有的耳朵。但是,我仍然想了解上面发生了什么,因为它对我来说很新......
非常感谢
答案 0 :(得分:3)
您可以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'}
,这有时候更容易处理,有时更复杂。