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

时间:2013-07-15 11:24:12

标签: javascript jquery

团队,任何人都可以帮助我如何使用javascript / jQuery从服务器获取SOAP响应的方法名称。请注意,方法名称不是固定的。它因服务器的每个通知而异。因此,我必须在客户端调用该方法。我不想使用除jQuery之外的任何库。

例如)

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

3 个答案:

答案 0 :(得分:1)

这是一个纯粹的VanillaJS的解决方案:(小提琴有点不同,因为它不接受回调函数,如果你想将一个函数传递给解析器,也可以使用this 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"

A working fiddle here。它基于我在前一段时间内为另一个问题编写的XML解析器Here's that fiddle,向您展示如何更改代码以满足您的需求。
使用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方法,以及很多关键字=&gt;反映SOAP api的值对,例如: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
        };
   };

答案 1 :(得分:1)

我是这样做的:

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

答案 2 :(得分:0)

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

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

您可以在示例中使用text()来获取实际文本值。