首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xml2js:输出怎么样?

xml2js:输出怎么样?
EN

Stack Overflow用户
提问于 2013-11-27 09:29:13
回答 6查看 47.5K关注 0票数 25

我正在尝试使用node.js模块xml2js

我的代码非常简单:

代码语言:javascript
复制
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文件如下:

代码语言:javascript
复制
<?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>

输出给我:

代码语言:javascript
复制
Complete result:
{ smil:
    { head: [''],
      body:
        [ { update: [[Object]],
            stream: [[Object]],
            playlist: [[Object]] } ] } }
Try to access element:
[Object]
Undefined

我通过尝试成功地访问了body,但是现在我被困住了,是否有一个模板或示例说明xml2js如何在某个地方输出解析的xml?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-11-27 09:48:21

对于那些想知道xml2js使用和滥用数组的人来说

对于我的文件,树应该是:

代码语言:javascript
复制
.result //Object
|_.head //Array
|_.body //Array
  |_.update //Array
  | |_.$ //Object
  |   |_.fields //Strings
  |
  |_.stream //Array
  | |_.$ //Object
  |   |_.fields //Strings
  |
  |_.playlist //Array
    |_.$ //Object
      |_.fields //Strings
      |
      |_.video //Array
        |_.$ //Object
          |_.fields //Strings
票数 5
EN

Stack Overflow用户

发布于 2014-02-24 01:46:42

TL;DR

比看上去更难。有关其他JSON端表示的详细信息,请阅读Open311 JSON和XML转换页面。所有“使用和滥用”数组、额外的对象层、没有出现在原始XML中的名称的成员,或者所有这三个。

长答案

xml2js有一个不值得羡慕的任务:以一种可以逆转的方式将XML转换为JSON,而无需事先了解模式。一开始似乎很明显:

代码语言:javascript
复制
<name>Fred</name> → { name: "Fred" }
<chacha /> → { chacha: null }

到目前为止很容易,对吧?不过,这个怎么样?

代码语言:javascript
复制
<x><y>z</y><x>

删除友好的人名使xml2js面临的不确定性更加突出。起初,您可能认为这是相当合理的:

代码语言:javascript
复制
{ x: { y: "z" } }

稍后,您会被这个XML文本绊倒,并意识到您的猜测-at schema是错误的:

代码语言:javascript
复制
<x><y>z</y><y>z2</y></x>

啊哦。也许我们应该用数组。至少所有成员都有相同的标签:

代码语言:javascript
复制
{ x: [ "z", "z2" ] }

然而,事实证明,这不可避免地是短视的:

代码语言:javascript
复制
<x><y>z</y><y>z2</y><m>n</m>happy</x>

嗯..。

代码语言:javascript
复制
{ x: [ { y: "z" }, { y : "z2" }, { m: "n" }, "happy" ] }

..。然后有人用一些属性和XML名称空间来擦亮您。

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

图书馆不同意这种理解。

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

唯一的选择是使用变量输出模式。正如我们在上面所看到的,这使得它一开始很简单,但是您很快就会发现自己编写了大量的条件代码。考虑一下,如果具有相同标记名的子级折叠到列表中,但只有在有多个标记名的情况下,会发生什么情况:

代码语言:javascript
复制
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 ...
票数 58
EN

Stack Overflow用户

发布于 2014-11-12 18:50:35

作为Xml2js文档状态,您可以将解析器配置为不滥用数组,方法是将属性explicitArray设置为false (重要的是:它必须是一个布尔值,因为字符串"false"只是而不是工作!)

示例:

代码语言:javascript
复制
var parser = new xml2js.Parser({explicitArray : false});

这样,您应该能够更轻松地访问您的JSON属性。希望这对任何人都有帮助。

票数 50
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20238493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档