0

团队,任何人都可以帮助我如何使用 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
如果我知道我的方法名称(标题),我只是尝试了以下方法。但在实际情况下,我不知道方法名称。如果我将“tittle”替换为“m: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
            });
        });
    });
}
4

3 回答 3

1

这是一个纯 VanillaJS 的解决方案:(小提琴有点不同,因为它不接受回调函数,如果您也想将函数传递给解析器,请使用此 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 解析器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我们定义的方法和许多反映 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
        };
   };
于 2013-07-15T11:49:00.707 回答
1

我是这样做的:

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

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

在 chrome 上测试,ie 和 ff。

编辑

var xml = "<rss><channel><title>MyTitle</title></channel></rss>",
$xml = $( xml ),
$title = $xml.find( "title" );
alert($title.text());
于 2013-07-15T11:55:44.300 回答
0

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

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

您将text()像在示例中一样使用来获取实际的文本值。

于 2013-07-15T11:41:55.733 回答