我在尝试解析从Ajax调用返回的XML字符串时遇到了问题。 XML的结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<endPointDefs>
<endPointDef>
<useCaseId>USER_LOGIN</useCaseId>
<endPointUrl>/core.authenticate.do</endPointUrl>
<endPointUrlParams>
<endPointUrlParam name="MsgFormat">
<urlParamType>SYSTEM_DEFINED</urlParamType>
<urlParamValueSystemDefined>USER_LOGIN</urlParamValueSystemDefined>
</endPointUrlParam>
<endPointUrlParam name="userId">
<urlParamType>USER_PROVIDED</urlParamType>
</endPointUrlParam>
<endPointUrlParam name="password">
<urlParamType>USER_PROVIDED</urlParamType>
</endPointUrlParam>
<endPointUrlParam name="language">
<urlParamType>USER_PROVIDED</urlParamType>
</endPointUrlParam>
</endPointUrlParams>
</endPointDef>
</endPointDefs>
但是,我需要useCaseId USER_LOGIN的标记值。一个典型的XPATH表达式应该是这样的:
/endPointDefs/endPointDef[useCaseId='USER_LOGIN']/endPointUrl
我将来自ajax调用的响应存储在javascript变量中,如下所示:
var endPointDefs=null;
此变量从Ajax调用填充,如下所示:
$.ajax(
{
type:"POST",
url: "<%=request.getContextPath()%>/data/EndPointDefs.xml",
dataType:"XML",
success:function(data){
//alert("End Points Loaded: " + data);
endPointDefs=data;
},
error: function() {
alert('an error occurred! which trying to fetch the end point definitions');
}
}
);
我尝试使用JQuery执行XPATH查询,如下所示:
$("endPointDefs/endPointDef[useCaseId='USER_LOGIN']/endPointUrl",endPointDefs).each(function(){
$('#txtUseCase').val('USER_LOGIN');
$('#txtEntryPointURL').val($(this).text());
})
这是此处显示的修改版本: http://www.compoc.com/tuts/
但是,另一种方法是迭代所有endPointDef元素并检查useCaseId的值,如果它匹配我的字符串[USER_LOGIN],则在文本框中设置文本。但是,更优雅的方法是使用上面指出的XPATH表达式,这样可以一次性获得所需的结果。
我尝试了很多组合,但似乎没有任何效果。 JQuery是否支持这种XPath查询?如果是这样,有人可以告诉我哪里出错了吗?
答案 0 :(得分:0)
我认为这里有两件事:首先,jQuery使用>
作为直接子选择器,所以你应该使用它而不是/
。其次,您使用endPointDefs xml作为上下文,这意味着当jQuery开始查找元素时,它已经在<endPointDefs>
标记中。在此标记中,没有<endPointDefs>
个标记,因此找不到任何标记。
编辑:另外,要检查标记中的文字,请使用:contains()
选择器。
编辑2:啊,现在我看到endPointUrl
旁边是useCaseId
,而不在其中。
我认为正确的选择器将是:
$("endPointDef>useCaseId:contains('USER_LOGIN')+endPointUrl",endPointDefs)
答案 1 :(得分:0)
jQuery不使用XPath,而是使用类似CSS的选择器。鉴于您只有一个endPointUrl
元素,我认为您可以使用以下选择器:
$("endPointUrl",endPointDefs)
由于您指出可以有多个endPointUrl
标记,我会选择以下内容,这是更自然的jQuery:
$('useCaseId', endPointDefs).filter(function(){
return $.text(this) == 'USER_LOGIN';
}).next();
答案 2 :(得分:0)
来自http://docs.jquery.com/DOM/Traversing/Selectors#XPath_Selectors
支持的谓词
[@ foo] 属性为foo
$("//input[@checked]")
[@ foo ='test'] 属性foo等于测试
$("//a[@ref='nofollow']")
- 醇>
[Nodelist] 元素包含节点列表,例如:
$("//div[p]") $("//div[p/a]")