如何使用javascript从soap中读取方法名称
How to read method name from soap using javascript
团队,有人能帮助我如何使用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()
来获得实际的文本值。
相关文章:
- 获取“;无法读取属性'[方法]'“未定义”;
- 这是使用node.js和jade打开文件并读取每一行的方法吗
- 一种读取或更改CSS动画关键帧的方法
- 什么'是使用Gulp读取、重建和替换文件中内容块的最有效方法
- 用Javascript或其他方法通过语音读取整个HTML页面(离线)
- Ajax serialize() 方法没有读取 html 表单的所有数据字段
- 在对象中调用对象方法 - 错误:无法读取未定义的属性
- 读取视频中的视频元素/属性的正确方法是什么.js
- PHP - 从 PDF 读取用户选择的文本的解决方法
- 类型错误:无法读取 nodejs 应用程序中未定义的属性“方法”
- 读取 URL 中单个变量的最简单方法是什么
- $.get() 方法 JQuery 不读取任何内容 (html)
- 可读流's的读取方法不返回null
- AngularJS-can't读取变量's在我的一个方法中更改了值,它返回旧的valud
- CSS3 Jquery Gradients-有什么方法可以读取设置的值吗
- 工厂方法没有't return-TypeError:无法读取属性'那么'的未定义
- 未调用Angularjs服务方法,TypeError:无法读取属性'
- 从方法读取AngularJS中的$Cookies
- 如何使用javascript从soap中读取方法名称
- 点击按钮后,点击如何使用javascript发出请求,并使用ajax MVC Kendo UI网格调用读取方法