了解util.inspect的输出
我从节点调用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>
我的最终目标是获取与凭证元素关联的令牌属性的值,并将其分配给“我的第一个节点应用程序”中的一个variables。
我第一次刺伤这个涉及使用一个叫做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: '' } } ] } ] } }
有人可以向我解释这实际上是什么意思? 即使我只是玩这个踢,我想了解我在看什么。 例如:
- 我如何引用JS中的xsi:schemalocation属性 (或者它是一个关键?)?
- 我相信我可以用比我pipe理的更简洁的方式来引用令牌值。 怎么样?
- 那里有什么美元符号? 他们是什么意思?
…当然,如果有比使用xml2js更好的方法来解决这个问题,我完全可以接受。 不过我还是想了解上面的情况,因为这对我来说是新的。
非常感谢
您可以通过result.tsResponse.$['xsi:schemalocation']
访问xsi:schemalocation
result.tsResponse.$['xsi:schemalocation']
。
这里是JavaScript对象文字语法的基础知识。 像一个对象字面值
x = { a: 5, b: 6 }
有两个属性, xa
(它是5)和xb
(它是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
来得到result.tsResponse.credentials[0].$.token
,这基本上和你写的一样,没有临时variables。 不幸的是,用xml2js不能比这更好。
关于xml2js:
-
xml2js使用“$”属性名称来表示XML属性,所以
<element attr1="a" attr2="b">
会变成包含$: {attr1: 'a', attr2: 'b'}
。 他们可以select任何其他名称,但是他们select了$,因为它是一个无效的XML元素名称(保证没有冲突),而且input起来很快。 -
默认情况下,xml2js将嵌套对象放入数组中。 例:
<element> <a>5</a> <a>6</a> <b>7</b> </element>
成为{a: ['5', '6'], b: ['7']}
。 注意到b
也是一个数组,尽pipe只有其中的一个。 如果你检查xml2js文档,你会发现有一个选项可以排除数组中的一个,所以你会得到{a: ['5', '6'], b: '7'}
,有时更容易处理,有时更复杂。
- Meteor.js错误:从exceptionxGHk6PkFTQ9uv8ncg TypeError:不能调用未定义的方法“查找”
- 导入Meteor中的ES6 npm模块时出现SyntaxError错误
- 我怎样才能find一个数组中具有特定值的对象的索引?
- WebDriver NodeJS实例化具有function的IE驱动程序:引入FlameinessByIgnoringProtectedModeSettings(ignoreSettings)
- coffeescript,玉器,手写笔 – > js,css资产经理? 的node.js
- 如何将Socket.io路由代码分离到不同的文件中
- 打字稿丢失信息模块加载w /没有.dts文件
- 为什么我的Node.js进程一旦所有的监听器都被删除就终止?
- 如何检查一个对象是否是一个node.jsstream实例?