Parse.com云代码评估xPath?

时间:2014-08-17 19:08:35

标签: xml xpath parse-platform cloud

我是使用Parse.com云代码的新手,主要是iOS开发人员。在iOS中,我使用Hpple,一个xPath评估器来解析xml文档。我现在需要在我的云代码中执行此操作。我想知道Javascript SDK中是否已经有一种方法可以使用像

这样的表达式

xpath表达式:

//day[@name='monday']/meal[@name='LUNCH']/counter[@name='Deli']/dish/name

从此网址评估此xml:

http://64.182.231.116/~spencerf/union_college/Upperclass_Sample_Menu.xml

这将返回字符串" Made to Order Deli Core"," Caprese Panini Biggie Sandwich"。有没有办法在Javascript SDK中执行此操作,还是有任何模块可以安装到解析的云代码中,可以像这样评估xml?

到目前为止我尝试过的代码是:

Parse.Cloud.define("next", function(request, response) {

  var xmlreader = require('cloud/xmlreader.js');

  Parse.Cloud.httpRequest({
    url: 'http://64.182.231.116/~spencerf/union_college/Upperclass_Sample_Menu.xml',
    success: function(httpResponse) {
        //console.log(httpResponse.text);
        var someXml = httpResponse.text;

        xmlreader.read(someXml, function (err, res){
            if(err) return console.log(err);

            // use .text() to get the content of a node:
            console.log( res.dish.text() );

        });

    },
    error: function(httpResponse) {
        console.error('Request failed with response code ' + httpResponse.status);
    }
  });


});

我可以将数据保存在我的变量some​​Xml中,我认为它保存为字符串,这可能会搞乱解析因为我无法解析它。我正在使用xmlReader来解析它(https://www.npmjs.org/package/xmlreader)有关于它如何工作的链接和解析的语法。我在解析它时遇到了麻烦。理想情况下,我想用xPath解析它,我在使用这段代码:

    var getElementByXpath = function (path) {
  return someXml.evaluate(path, someXml, null, 2, null).stringValue;

  };
  console.log(getElementByXpath("//day[@name='monday']/meal[@name='LUNCH']/counter[@name='Deli']/dish/name"));

但这不起作用,它给了我这个错误

has no method 'evaluate'
at getElementByXpath (main.js:131:20)
at Object.Parse.Cloud.httpRequest.success (main.js:134:17)
at Object.<anonymous> (<anonymous>:571:19)

在我提供的链接上,我想在星期一/午餐时获得所有名称节点

3 个答案:

答案 0 :(得分:1)

不确定这是否可以在Parse.com中讨论上述评论中提到的可能的限制(用户dirkk),但也许这可以起作用/帮助:

var getElementByXpath = function (path) {
 return document.evaluate(path, document, null, 2, null).stringValue;
};
alert(getElementByXpath("//book/title"));

工作演示:Javascript XPath

更新:上面使用XPath的Javascript进行XML解析包含在OP中。虽然它可以工作,但下一个问题是通过URL获取XML文件。 OP不首选使用Ajax / jQuery的建议解决方案。建议改为使用Parse.Cloud.httpRequest。在此处查找参考:Cloud Code Response Object。另外,此处提到的解决方案存在类似问题:Unable to parse data from an xml file in the Parse Cloud using xmlreader in express app和此处:How to make a REST GET request (with authentication) and parse the result in javascript? 查看此处可能很有用:Parse Cloud Code

更新:随着问题的调整,Parse Cloud xmlreader现在经过测试,可以从XML文件中获取星期一午餐名称。由于xmlreader的文档不提供直接按属性值访问节点属性,所以在解决方案之后,虽然由于嵌套的for循环看起来很难看,但是可以工作:

xmlreader.read(someXml, function (err, res){
if(err) return console.log(err);
for(var i = 0; i < res.day.count(); i++){
  if (res.day(i).text()) == "monday")
  {
    for(var j = 0; j < res.day(i).meal.count(); j++){
      if (res.day(i).meal(j).text() == "LUNCH")
      {
        for(var k = 0; k < res.day(i).meal(j).counter.dish; k++){
          console.log( res.day(i).meal(j).counter.dish(k).name.text());
        }
      } 
   }
 }

更新:由于使用类似javascript xpath的函数进行解析是首选,而Parse似乎还没有提供带有Xpath的XML解析 - 底部的https://parse.com/questions/htmlxml-parser-with-xpath-on-cloud-code语句 - 并建议包含适当的javascript库或节点。相反 - 在这里找到例子:https://temboo.com/nodejs/parsing-xml - 也许这会有所帮助。如果尚未尝试,请检查https://parse.com/questions/can-we-importrequireinclude-any-other-javascript-files-in-our-cloud-code

答案 1 :(得分:0)

这里很好

xmlreader.read(someXml, function (err, res){
if(err) return console.log(err);
for(var i = 0; i < res.day.count(); i++){
  if (res.day(i).text()) == "monday")
  {
    for(var j = 0; j < res.day(i).meal.count(); j++){
      if (res.day(i).meal(j).text() == "LUNCH")
      {
        for(var k = 0; k < res.day(i).meal(j).counter.dish; k++){
          console.log( res.day(i).meal(j).counter.dish(k).name.text());
        }
      } 
   }
 }

答案 2 :(得分:0)

这可以帮助你,让你开始

    Parse.Cloud.define("next", function(request, response) {

  var xmlreader = require('cloud/xmlreader.js');

  Parse.Cloud.httpRequest({
    url: 'http://64.182.231.116/~spencerf/union_college/Upperclass_Sample_Menu.xml',
    success: function(httpResponse) {
        //console.log(httpResponse.text);
        var someXml = httpResponse.text;
    xmlreader.read(someXml, function (err, res){
        if(err) return console.log(err);

        // use .text() to get the content of a node:
        console.log( res.dish.text() );

    });

},
error: function(httpResponse) {
    console.error('Request failed with response code ' + httpResponse.status);
}