如何在Meteor后端解析XML?

时间:2015-03-21 15:48:20

标签: xml parsing meteor backend

我试图在主体为XML的后端使用HTTP调用来解析XML。问题是我们不能在后端使用Jquery或DOMParser来解析。我们试图先在前端解析它,然后将它作为变量发送到meteor方法(在后端),但它太大(超过最大堆栈)。我们还尝试添加一个节点模块来完成它,但它没有正常工作。

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

3 个答案:

答案 0 :(得分:10)

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

  1. HTTP,所以你可以" GET"外部XML
  2. xml2js,因此您可以在XML出现后解析它
  3. 安装并重新启动服务器,如下所示:

    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的新用户,请特别注意"错误"参数首先在回调函数中。

    第三,试试这个方法。这就像是一场电话游戏。

    1. 客户端调用流星服务器。 Meteor.call('xmlDemo');
    2. meteor服务器调用外部URL。
    3. 如果一切顺利,该方法将读取文件内容,并在服务器的控制台上显示输出。 (即,查看您运行的终端" 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

      • explicitArray:false(默认情况下,像<this>example</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}, 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)

  

我们尝试添加一个节点模块,但它无法正常工作。

您可能已经因不兼容的依赖项而被绊倒。

尝试node-xml2js,只需要sax.js,只需要JavaScript。