团队,任何人都可以帮助我如何使用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
});
});
});
}
答案 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()
来获取实际文本值。