我正在尝试使用 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
我已经通过尝试成功访问了正文,但现在我卡住了,是否有模板或示例说明 xml2js 如何在某处输出解析的 xml?
最佳答案
TL;DR
它比看起来更难。阅读 Open311 JSON and XML Conversion页面了解其他 JSON 端表示的详细信息。所有“使用和滥用”数组、额外的对象层、名称未出现在原始 XML 中的成员,或三者兼有。
长答案
xml2js有一个令人羡慕的任务:以一种可以反转的方式将 XML 转换为 JSON,而无需事先知道架构。一开始似乎很明显:
<name>Fred</name> → { name: "Fred" }
<chacha /> → { chacha: null }
到目前为止很容易,对吧?不过,这个怎么样?
<x><y>z</y><x>
删除人性化的名称会导致 xml2js
面临的不确定性。起初,您可能认为这是相当合理的:
{ x: { y: "z" } }
稍后,您在此 XML 文本中绊倒并意识到您猜测的架构是错误的:
<x><y>z</y><y>z2</y></x>
哦哦。也许我们应该使用数组。至少所有成员都有相同的标签:
{ x: [ "z", "z2" ] }
然而,这不可避免地是短视的:
<x><y>z</y><y>z2</y><m>n</m>happy</x>
呃……
{ x: [ { y: "z" }, { y : "z2" }, { m: "n" }, "happy" ] }
...然后有人用一些属性和 XML 命名空间来完善你。
构建更简洁的输出模式的方法对您来说是显而易见的。您可以从标签和属性名称中推断出详细信息。你懂的。
图书馆不同意这种理解。
如果库不知道架构,它必须要么“使用和滥用”数组、额外的对象层、特殊属性名称,要么三者兼而有之。
唯一的选择是使用可变输出模式。一开始它很简单,正如我们在上面看到的,但你很快就会发现自己编写了大量的条件代码。考虑一下如果将具有相同标签名称的子项折叠到一个列表中会发生什么,但前提是存在多个:
if (Array.isArray(x.y)) {
processTheYChildren(x.y);
} else if (typeof(x.y) === 'object') {
// only one child; construct an array on the fly because my converter didn't
processTheYChildren([x.y]);
} else ...
关于xml2js : how is the output?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20238493/