了解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.propertyNameobj['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'} ,有时更容易处理,有时更复杂。