我试图使用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中的成员,或所有三个。