微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Meteor后端解析XML?

我正在尝试在后端使用HTTP调用解析 XML,其中主体是 XML.问题是我们不能在后端使用 Jquery或DOMParser来解析.我们试图先在前端解析它,然后将它作为变量发送到meteor方法(在后端),但它太大(超过最大堆栈).我们还尝试添加节点模块来执行此操作,但它无法正常工作.

我们怎样才能在Meteor的后端获得解析的XML对象?

首先,您需要安装几个软件包.

> HTTP,因此您可以“获取”外部XML
> xml2js,因此您可以在XML出现后解析它

像这样安装并重启服务器:

meteor add http peerlibrary:xml2js && meteor

其次,构建服务器端功能.它不一定是Meteor方法,但是对于这个例子,我会将它放在一个中,这样我们就可以轻松地解决它.使用HTTP.call() or HTTP.get()发出请求.然后是URL;我将使用示例XML文件.然后是后URL参数;就我而言,没有.然后是回调函数.

Meteor.methods({
    'xmlDemo':function(){
        HTTP.call('GET','http://www.xmlfiles.com/examples/plant_catalog.xml',{},function(callError,callResponse){
                console.log('xml',callResponse);
            }
        );
    }
});

如果您是Meteor的新手,请首先在回调函数中特别注意“error”参数.

第三,尝试该方法.这就像一场电话游戏.

>客户端调用流星服务器. Meteor.call( ‘xmlDemo’);
>流星服务器调用外部URL.

如果一切顺利,该方法将读取文件内容,并在服务器的控制台上显示输出. (即看看你运行“流星”的终端)

{ statusCode: 200,content: '<?xml version="1.0" encoding="ISO8859-1" ?>\r\n<CATALOG>\r\n
(et cetera...)
(et cetera...)
(et cetera...)',headers:
 { 'content-type': 'text/xml','last-modified': 'Tue,24 Apr 2012 21:06:45 GMT','accept-ranges': 'bytes',etag: '"80a095275e22cd1:0"',server: 'Microsoft-IIS/7.5','x-powered-by': 'ASP.NET',date: 'Mon,30 Nov 2015 19:17:26 GMT','content-length': '8167' },data: null }

这里看到的最重要的事情是来自HTTP.call的响应是一个对象. “content”字段保存实际数据. (这是我个人被绊倒的地方.)

第四,尝试将XML字符串传递给xml2js.

Meteor.methods({
    'xmlDemo':function(){
        HTTP.call('GET',callResponse){
                //console.log('xml',callResponse);
                xml2js.parseString(callResponse.content,function (jsError,jsResult) {
                    console.error('errors',jsError);
                    console.log('xml to js',jsResult);
                });
            }
        );
    }
});

再一次,运气好的话,你会看到植物作为终端打印出来的物体.您现在要做的就是获取对象数组,遍历它,并将内容存储到集合中. Underscore让它变得简单(它内置于Meteor)

_.each(jsResult.CATALOG.PLANT,function(plant){
    Plants.insert(plant);
}

最后,您将添加几个故障保险箱来报告错误.另外xml2js开箱即用并不一定能很好地收集集合的工作方式.你需要set a few options.

> explicitArray:false(认情况下,像< this>示例< / this>这样的标签会变成{this:[“example”]}.在Mongo中,这被认为是嵌入式文档,你会遇到麻烦.)
> emptyTag:undefined(认情况下,像< this />这样的空标签会变成{this:”}.就个人而言,我觉得让空的东西不存在更容易,检查它们是否存在而不是检查它们是否存在并且实际上有内容)

清理完我自己的一些代码后,这是最后一个例子

在/lib/file.js上…

Plants = new Mongo.Collection('plants');

在/server/file.js上…

Meteor.methods({
    'xmlDemo':function(){
        HTTP.get('http://www.xmlfiles.com/examples/plant_catalog.xml',function(xmlError,xmlResponse){
                if(xmlError){
                    console.error('xmlError',xmlError);
                }else{
                    xml2js.parseString(xmlResponse.content,{explicitArray:false,emptyTag:undefined},jsResult) {
                    if(jsError){
                        console.error('xml2js error',jsError);
                    }else{
                        _.each(jsResult.CATALOG.PLANT,function(plant){
                            Plants.insert(plant);
                        }
                    }
                });
            }
        );
    }
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。