我正在尝试使用node.js模块xml2js
我的代码很简单:
function testparse(pathname, callback) {
var parser = require('xml2js').Parser(),
util = require('util'),
fs = require('fs'),
fs.readFile(pathname, function (err, data) {
parser.parseString(data, function(err, result) {
console.log('Complete result:');
console.log(util.inspect(result, {depth: null})); //Work
console.log('Try to access element:');
console.log(result.smil.body); //Work
console.log(result.smil.body.update); //Undefined
});
});
}
我的xml文件如下:
<?xml version="1.0"?>
<smil>
<head/>
<body>
<update /*some field*//>
<stream name="name"/>
<playlist /*some field*/>
<video /*some field*//>
<video /*some field*//>
<video /*some field*//>
</playlist>
</body>
</smil>
输出给予我:
Complete result:
{ smil:
{ head: [''],
body:
[ { update: [[Object]],
stream: [[Object]],
playlist: [[Object]] } ] } }
Try to access element:
[Object]
Undefined
我已经通过尝试成功地访问了body,但现在我被卡住了,有没有一个模板或例子说明xml2js如何在某处输出解析后的xml?
6条答案
按热度按时间fhity93d1#
TL;DR
比看起来难多了。阅读Open 311 JSON and XML Conversion页面,了解其他JSON端表示的详细信息。它们都“滥用”数组、额外的对象层、名称没有出现在原始XML中的成员,或者三者都有。
长应答
xml2js有一个不值得羡慕的任务:将XML转换为JSON的方式可以逆转,而无需事先知道模式。起初,这似乎很明显:
到目前为止很简单对吧那这个呢
删除人性化的名称使
xml2js
面临的不确定性变得清晰。起初,你可能会认为这是合理的:后来,您被这个XML文本绊倒了,并意识到您猜测的模式是错误的:
也许我们应该用数组。至少所有成员都有相同的标签:
然而,这不可避免地被证明是短视的:
呃...
...然后有人用一些属性和XML名称空间来修饰您。
构造更简洁的输出模式的方法对您来说是显而易见的。可以从标记和属性名称推断详细信息。你懂的
图书馆不同意这种理解。
如果库不知道模式,它必须“使用和滥用”数组、额外的对象层、特殊的属性名,或者三者都使用。
唯一的选择是采用可变输出模式。这使它一开始很简单,正如我们上面看到的,但是您很快就会发现自己编写了大量的条件代码。考虑一下,如果具有相同标签名称的子标签被折叠到一个列表中会发生什么,但只有当有多个子标签时才会发生:
nhhxz33t2#
正如xml 2 js的文档所述,您可以通过将属性
explicitArray
设置为false
(重要信息:它必须是一个布尔值,因为字符串"false"
将只是不工作!)示例:
这样,您应该能够以更简单的方式访问JSON属性。我希望这能帮助任何人。
exdqitrt3#
返回的JSON对JavaScript不太友好。我已经写了一个帮助函数,可以使它更容易使用。
在使用它之前一定要阅读它,以便您了解它的功能。
示例:
成为
和/或
成为
它还可以安全地转换整数/浮点数。
44u64gxh4#
对于那些想知道的人,xml2js使用和滥用数组
对于我的文件,树将是:
vojdkbi05#
您可能想尝试
console.log(util.inspect(result, false, null))
,它应该显示整个结果。mzaanser6#
对我来说,这是一个console.dir问题,或者更准确地说,是一个非问题。
当我console.dir输出时,我得到了相同的结果:
但我惊讶地发现,这是一个console.dir限制,数据实际上是存在的。显然console.dir没有显示超过几个级别。当我控制.dir更深一层时,数据就在那里:
输出:
我开始寻找其他的libs,只是回去再试一次。如果这能帮助任何人欢呼。