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

How to read method name from soap using javascript

本文关键字:读取 方法 soap 何使用 javascript      更新时间:2023-09-26

团队,有人能帮助我如何使用javascript/jQuery从服务器的SOAP响应中获取方法名称吗。请注意,方法名称不是固定名称。对于来自服务器的每个通知,它都有所不同。因此,我必须在客户端调用该方法。除了jQuery之外,我不想使用任何库。

eg)

 <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
 <SOAP-ENV:Header></SOAP-ENV:Header>
    <SOAP-ENV:Body>
       <m:ActivatedForResponse xmlns:m="http://schemas.velu.com">
          <resultCode>0</resultCode>
       </m:ActivatedForResponse>
    </SOAP-ENV:Body>
 </SOAP-ENV:Envelope>

问题2
如果我知道我的方法名称(标题),我只是尝试了下面的方法。但在实际情况下,我不知道方法名称。如果我用"m:tittle"代替"tittle",那就行不通了?我有什么错吗?

var xml = "<rss><channel><title>MyTitle</title></channel></rss>",
xmlDoc = $.parseXML( xml ),
$xml = $( xmlDoc ),
$title = $xml.find( "title" );
// Please note that i don't want the text; 
// i want to load "title" element itself when it is declared as "m:title" in xml.
alert($title.text());

解决方案

function Test(){
    xml=loadXMLText("config.xml");
    var $xmlDoc = $(xml),
    $bodyNode = $xmlDoc .find("SOAP-ENV'':Body");
    $bodyNode.each(function(){ //Iterate mutiple body in different envelope
        $(this).children().each(function(){ //Iterate mutiple remote methods inside the body
            alert($(this).get(0).tagName); // Remote method name
            $(this).children().each(function(){
                alert($(this).prop("tagName")); //attribute name
                alert($(this).text());          //attribute value
            });
        });
    });
}

我是这样做的:

http://jsfiddle.net/mattydsw/BsrTR/

var $xml = $("<rss><channel><m:title>MyTitle</m:title></channel></rss>"),
    $title = $xml.find("m'':title");

铬测试,即和ff。

编辑

var xml = "<rss><channel><title>MyTitle</title></channel></rss>",
$xml = $( xml ),
$title = $xml.find( "title" );
alert($title.text());

这里有一个纯VanillaJS的解决方案:(fiddle有点不同,因为它不接受回调函数,如果你想把函数传递给解析器,也可以使用这个JSBin中的代码)

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"

这是一把正在工作的小提琴。它基于我不久前为另一个问题写的XML解析器。这是一个小提琴,向您展示如何更改代码以最适合您的需求
要使用m:title编写代码,只需将getElementsByTagName(tagNames)更改为getElementsByTagNameNS('', tagNames);即可。

扩展一下我的最新评论:

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);

soapAPI对象现在包含我们定义的update方法和许多反映SOAPapi的key=>值对,例如: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
        };
   };

这将返回您向我们显示的xml字符串中的title元素…

var $title = $(xml).find("title");

您可以像在示例中那样使用text()来获得实际的文本值。