我试图在主体为XML的后端使用HTTP调用来解析XML。问题是我们不能在后端使用Jquery或DOMParser来解析。我们试图先在前端解析它,然后将它作为变量发送到meteor方法(在后端),但它太大(超过最大堆栈)。我们还尝试添加一个节点模块来完成它,但它没有正常工作。
我们怎样才能在Meteor的后端获得解析后的XML对象?
答案 0 :(得分:10)
首先,您需要安装几个软件包。
安装并重新启动服务器,如下所示:
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的新用户,请特别注意"错误"参数首先在回调函数中。
第三,试试这个方法。这就像是一场电话游戏。
Meteor.call('xmlDemo');
如果一切顺利,该方法将读取文件内容,并在服务器的控制台上显示输出。 (即,查看您运行的终端" meteor")
{ 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的响应是一个对象。 &#34;内容&#34;字段保存实际数据。 (这是我个人被绊倒的地方。)
第四,尝试将XML字符串传递给xml2js。
Meteor.methods({
'xmlDemo':function(){
HTTP.call('GET',
'http://www.xmlfiles.com/examples/plant_catalog.xml',
{},
function(callError,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。
<this>example</this>
这样的标记会变成{this:["example"]}
。在Mongo中,这被认为是嵌入式文档,而且您会遇到麻烦。) <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}, function (jsError, jsResult) {
if(jsError){
console.error('xml2js error',jsError);
}else{
_.each(jsResult.CATALOG.PLANT,function(plant){
Plants.insert(plant);
}
}
});
}
);
}
});
答案 1 :(得分:3)
添加xml2js包,创建一个Meteor方法并在其中放置这样的内容,
xml2js.parseString(xml, function (err, result) {
console.dir(result);
});
然后从客户端调用它。 您应该在流星控制台中看到您的xml已解析为json。
答案 2 :(得分:1)