从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.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'},这有时更容易处理,有时更复杂。

关于javascript - 了解util.inspect的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22975671/

10-09 14:16