如何使用javascript从soap读取方法名
团队,有谁能帮助我如何使用javascript/jQuery从服务器的SOAP响应中获取方法名吗。注意,方法名不是固定的。它因服务器发出的每个通知而异。因此,我必须在客户端调用该方法。我不想使用jQuery以外的任何库 (例如)如何使用javascript从soap读取方法名,javascript,jquery,Javascript,Jquery,团队,有谁能帮助我如何使用javascript/jQuery从服务器的SOAP响应中获取方法名吗。注意,方法名不是固定的。它因服务器发出的每个通知而异。因此,我必须在客户端调用该方法。我不想使用jQuery以外的任何库 (例如) 这将返回您显示给我们的xml字符串中的title元素 var $title = $(xml).find("title"); 您可以使用示例中的text()来获取实际的文本值。这里有一个纯VanillaJS的解决方案:(fiddle有点不同,它不接受回调函数,如果您想将
这将返回您显示给我们的xml字符串中的title元素
var $title = $(xml).find("title");
您可以使用示例中的
text()
来获取实际的文本值。这里有一个纯VanillaJS的解决方案:(fiddle有点不同,它不接受回调函数,如果您想将函数传递给解析器,也可以使用来自的代码)
基本用法:
soapAPI.update(xmlString);//where XML contains method names you're after
console.log(soapAPI);
soapAPI
对象现在包含我们定义的update
方法和许多反映soapAPI的键=>值对,例如:title:getTitleMethodName
要进一步优化此功能,您可以重写更新函数,如下所示:
update = (function()
{
var callback = function(node)
{//declare callback only once, here
return {node.tagName.toLowerCase(): node.textContent};
};
return function(xml)
{
var i, parsed = parseXML(xml, '*',callback);
for(i=0;i<parsed.length;i++)
{
api[parsed[i].tag] = parsed[i].val;
}
return api;//<-- this is just for fluent interface
};
};
update=(函数()
{
var callback=函数(节点)
{//此处仅声明回调一次
返回{node.tagName.toLowerCase():node.textContent};
};
返回函数(xml)
{
变量i,parsed=parseXML(xml,“*”,回调);
对于(i=0;i我是这样做的:
var$xml=$(“MyTitle”),
$title=$xml.find(“m\\:title”);
在铬、ie和ff上测试
编辑
var xml = "<rss><channel><title>MyTitle</title></channel></rss>",
$xml = $( xml ),
$title = $xml.find( "title" );
alert($title.text());
var xml=“MyTitle”,
$xml=$(xml),
$title=$xml.find(“title”);
警报($title.text());
jQuery是一个库???@Bergi:)而不是jQuery。谢谢。但我不想阅读“标题”的内容;我想在xml类似时找出“标题”本身。@KanagaveluSugumar:,只需将getElementsByTagName
更改为GetElementsByTagnames('',标记名)
您完成了+1。谢谢!Elias,但标记名不固定用于搜索。它随服务器的每个响应而变化。现在我该怎么办?@KanagaveluSugumar:这就是我的代码的来源:parseXML(响应,'tagToSearch');
:传递的第二个参数是要搜索的标记。因此,如果要搜索title
,只需调用parseXML(xmlString,'title');
而如果要搜索quote
标记,下次只需调用parseXML(xmlString,'quote'))
。默认情况下,如果要返回其他内容,上面的代码将返回textContent:simpleXML(xmlString,'p',function(elem){elem.tagName().toLowerCase()});
您传递的函数将应用于elems Found,parseXML
函数的编写方式是,您只需创建一个解析器对象,在每次调用parseXML
时都会重复使用它。这使得代码在一开始就比较复杂,但您应该看到的是retrun函数(xmlString,tagName,optionalCallback)
line,因为这是实际解析和搜索xmlString的代码谢谢!我试过了,但不起作用。奇怪的是,你的代码和下面的代码有什么不同吗?var xml=“MyTitle”,xmlDoc=$.parseXML(xml),$xml=$(xmlDoc),$title=$xml.find(“m\\:title”);alert($title.text());是的。您的代码不同。我没有使用parseXML
方法,但我创建了用xml字符串初始化的jquery对象。请参阅我的编辑。+1谢谢Matty;您的第一个答案解决了:问题。但有两件事1)事实上,我不知道要查找的方法名。这是我必须查找的,因为服务器发送了大量soap xml来执行远程方法调用。2)如果您对parseXML和直接解析之间的区别进行更多的解释,将有助于更像我(新手)您的意思是您不知道要查找的xml节点名?
var parseXML = (function(w,undefined)
{//create parser
'use strict';
var parser,i,ie,parsed;
ie = false;
switch (true)
{
case w.DOMParser !== undefined:
parser = new w.DOMParser();
break;
case new w.ActiveXObject("Microsoft.XMLDOM") !== undefined:
parser = new w.ActiveXObject("Microsoft.XMLDOM");
parser.async = false;
ie = true;
break;
default :
throw new Error('No parser found');
}
return function(xmlString,getTags, optionalCallback)
{
var tags,keep = [];
if (ie === true)
{
parser.loadXML(xmlString);
parsed = parser;
}
else
{
parsed = parser.parseFromString(xmlString,'text/xml');
}
tags = parsed.getElementsByTagNameNS('',getTags);
for(i=0;i<tags.length;i++)
{
if (opionalCallback)
{
keep.push(optionalCallback(tags[i]));
}
else
{
keep.push(tags[i].textContent);
}
}
//keep.push(parsed);//last element of array is the full DOM
return keep;
};
})(this);
var parseResult = parseXML('<rss><channel><m:title>MyTitle</m:title></channel></rss>','title');
var withCB = parseXML('<rss><channel><m:title>MyTitle</m:title></channel></rss>','title',function(node)
{
return node.tagName.toLowerCase() + ' => ' + node.textContent.trim();
});
console.log(parseResult[0]);//logs "My Title"
console.log(withCB[0]);//logs "title => My Title"
var soapAPI= (function()
{
var parseXML = (function(){}()),//code from above
api = {},
update = function(xml)
{
var i, parsed = parseXML(xml, '*',function(node)
{//change this function to scan for methodName tags in your XML
return {tag: node.tagName.toLowerCase(),
val: node.textContent};
});
for(i=0;i<parsed.length;i++)
{
api[parsed[i].tag] = parsed[i].val;
}
return api;
};
api.update = update;
return api;
}());
soapAPI.update(xmlString);//where XML contains method names you're after
console.log(soapAPI);
update = (function()
{
var callback = function(node)
{//declare callback only once, here
return {node.tagName.toLowerCase(): node.textContent};
};
return function(xml)
{
var i, parsed = parseXML(xml, '*',callback);
for(i=0;i<parsed.length;i++)
{
api[parsed[i].tag] = parsed[i].val;
}
return api;//<-- this is just for fluent interface
};
};
var $xml = $("<rss><channel><m:title>MyTitle</m:title></channel></rss>"),
$title = $xml.find("m\\:title");
var xml = "<rss><channel><title>MyTitle</title></channel></rss>",
$xml = $( xml ),
$title = $xml.find( "title" );
alert($title.text());