加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml2js:输出如何?

发布时间:2020-12-16 08:00:27 所属栏目:百科 来源:网络整理
导读:我试图使用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,funct
我试图使用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命名空间来抛光你。

构建更简洁的输出模式的方式对您来说显而易见。您可以从标签和属性名称推断出详细信息。你明白了

图书馆不同意这一理解。

如果库不知道模式,它必须“使用和滥用”数组,多余的对象层,特殊的属性名称,或全部三个。

唯一的选择是使用可变输出模式。起初我们看到上面那样简单,但是你会很快发现自己写了大量的条件代码。考虑如果具有相同标签名称的儿童被折叠到列表中,但只有在存在多于一个的情况下会发生什么:

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:比它看起来要困难得多有关其他JSON端表示的详细信息,请阅读Open311 JSON and XML Conversion页面。所有“使用和滥用”数组,对象的额外层,名称未显示在原始XML中的成员,或所有三个。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读