我正在尝试使用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的模板或示例?

最佳答案

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 namespace 完善了您的工作。

构造更简洁的输出模式的方法对您来说显而易见。您可以从标记和属性名称中推断出详细信息。你懂的

图书馆不同意这种理解。

如果库不知道架构,则它必须“使用和滥用”数组,额外的对象层,特殊的属性名称或全部三个。

唯一的选择是采用可变输出模式。就像我们在上面看到的,这首先使它变得简单,但是您很快就会发现自己编写了大量的条件代码。请考虑将具有相同标签名称的子代折叠到一个列表中(但仅当多个子代)折叠时会发生什么情况:
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 ...

TL; DR:比看起来难。阅读Open311 JSON and XML Conversion页面以获取其他JSON端表示形式的详细信息。所有“使用和滥用”数组,额外的对象层,名称未出现在原始XML中的成员或全部三个。

10-06 16:01