节点js返回任何req.params.id XML元素app.get

时间:2014-10-03 14:28:42

标签: xml node.js

此代码仅在我键入last xml的元素ID时才返回内容。 我想在输入任何元素的ID时加载内容和页面。 怎么做?

 var libxmljs = require("libxmljs");
 var xml = ('/Path/Apples.xml');
 fs.readFile(__dirname + '/Apples.xml', function (err, data) {


     var xmlStr = data.toString();
     var xmlDoc2 = libxmljs.parseXmlString(xmlStr);
 var Apple = xmlDoc2.get('Apples').childNodes();

    for (var i = 0; i < Apple.length; i++) {
     var nameattr = xmlDoc2.get('Apples').get('Apple').attr('id').value();
     var AppleId = Apple[i].attr('id');

     if (AppleId !== null) {
         var AppleIdVal = AppleId.value();
         console.log('somename ' + AppleIdVal);

         app.get('/obj/:id', function (req, res) {
             if (req.params.id == AppleIdVal) {


                 console.log('nameAttr: ' + AppleIdVal);
                 res.json('This is id: ' + AppleIdVal);

             }


         });
     }
 }

1 个答案:

答案 0 :(得分:0)

只有函数闭包可以捕获当前的变量值,而不是if () {}块。此外,您每次AppleId不是null时都会添加一堆重复的路由。考虑重写您的逻辑,例如:

var libxmljs = require('libxmljs');

var xmlDoc2, Apple;

fs.readFile(__dirname + '/Apples.xml', function(err, data) {
  xmlDoc2 = libxmljs.parseXmlString(data.toString());
  Apple = xmlDoc2.get('Apples').childNodes();

  // move your `app.listen()` here instead so that the file will have been read
  // before processing any requests
});

app.get('/obj/:id', function (req, res) {
  for (var i = 0; i < Apple.length; i++) {
    var nameattr = xmlDoc2.get('Apples').get('Apple').attr('id').value(),
        AppleId = Apple[i].attr('id');

    if (AppleId !== null) {
      var AppleIdVal = AppleId.value();
      if (req.params.id == AppleIdVal)
        return res.json('This is id: ' + AppleIdVal);
    }
  }
  res.json('id not found');
});

此外,您可以考虑为执行单个xpath查找的代码交换for循环以查找id