如何使用javascript从soap读取方法名

如何使用javascript从soap读取方法名,javascript,jquery,Javascript,Jquery,团队,有谁能帮助我如何使用javascript/jQuery从服务器的SOAP响应中获取方法名吗。注意,方法名不是固定的。它因服务器发出的每个通知而异。因此,我必须在客户端调用该方法。我不想使用jQuery以外的任何库 (例如) 这将返回您显示给我们的xml字符串中的title元素 var $title = $(xml).find("title"); 您可以使用示例中的text()来获取实际的文本值。这里有一个纯VanillaJS的解决方案:(fiddle有点不同,它不接受回调函数,如果您想将

团队,有谁能帮助我如何使用javascript/jQuery从服务器的SOAP响应中获取方法名吗。注意,方法名不是固定的。它因服务器发出的每个通知而异。因此,我必须在客户端调用该方法。我不想使用jQuery以外的任何库

(例如)


这将返回您显示给我们的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());