我是使用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);
}
});
});
我可以将数据保存在我的变量someXml中,我认为它保存为字符串,这可能会搞乱解析因为我无法解析它。我正在使用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)
在我提供的链接上,我想在星期一/午餐时获得所有名称节点
答案 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);
}