了解util.inspect的输出

时间:2014-04-09 23:12:05

标签: javascript node.js

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: '' } } ] } ] } }

有人可以向我解释这实际意味着什么吗?即使我只是为了踢球而玩这个,我想要明白我在看什么。例如:

  • 我如何引用 xsi:schemalocation属性(或者它是一个 关键?)在JS?
  • 我确定我可以更多地引用令牌值 比我管理的简洁时尚。怎么样?
  • 那里有那些美元符号?它们意味着什么?

...当然,如果有更好的方法来解决这个问题,而不是使用xml2js,那我就是所有的耳朵。但是,我仍然想了解上面发生了什么,因为它对我来说很新......

非常感谢

1 个答案:

答案 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.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作为标记获取,这基本上与您编写的一样,没有临时变量。不幸的是,只有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'},这有时候更容易处理,有时更复杂。