XPATH表达式在JQuery中失败
我在尝试解析从Ajax调用返回的XML字符串时遇到问题。XML的结构如下所示:XPATH表达式在JQuery中失败,jquery,xpath,Jquery,Xpath,我在尝试解析从Ajax调用返回的XML字符串时遇到问题。XML的结构如下所示: <?xml version="1.0" encoding="UTF-8"?> <endPointDefs> <endPointDef> <useCaseId>USER_LOGIN</useCaseId> <endPointUrl>/core.authenticate.do</endPointUrl> &l
<?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>
var endPointDefs=null;
$.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');
}
}
);
$("endPointDefs/endPointDef[useCaseId='USER_LOGIN']/endPointUrl",endPointDefs).each(function(){
$('#txtUseCase').val('USER_LOGIN');
$('#txtEntryPointURL').val($(this).text());
})
我将来自ajax调用的响应存储在javascript变量中,如下所示:
<?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>
var endPointDefs=null;
$.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');
}
}
);
$("endPointDefs/endPointDef[useCaseId='USER_LOGIN']/endPointUrl",endPointDefs).each(function(){
$('#txtUseCase').val('USER_LOGIN');
$('#txtEntryPointURL').val($(this).text());
})
此变量通过Ajax调用填充,如下所示:
<?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>
var endPointDefs=null;
$.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');
}
}
);
$("endPointDefs/endPointDef[useCaseId='USER_LOGIN']/endPointUrl",endPointDefs).each(function(){
$('#txtUseCase').val('USER_LOGIN');
$('#txtEntryPointURL').val($(this).text());
})
这是此处显示内容的修改版本:
不过,另一种方法是迭代所有endPointDef元素,检查useCaseId的值,如果它与我的字符串[USER_LOGIN]匹配,则在文本框中设置文本。但是,一种更优雅的方法是使用上面提到的XPATH表达式,它可以一次性提供所需的结果
我尝试了许多组合,但似乎没有任何效果。JQuery支持这种XPath查询吗?如果是这样,有人能告诉我哪里出了问题吗?我认为这里有两件事:首先,jQuery使用
作为直接子选择器,因此您应该使用它而不是/
。其次,您使用endpointdefsxml作为上下文,这意味着当jQuery开始查找元素时,它已经“在”了
标记中。在这个标记中,没有
标记,因此它找不到任何标记
编辑:另外,要检查标记中的文本,请使用:contains()
选择器
编辑2:啊,现在我看到endPointUrl
在useCaseId
旁边,而不是在它里面
我认为正确的选择应该是:
$("endPointDef>useCaseId:contains('USER_LOGIN')+endPointUrl",endPointDefs)
jQuery不使用XPath,而是使用类似CSS的选择器。鉴于您只有一个
endPointUrl
元素,我认为您可以使用以下选择器:
$("endPointUrl",endPointDefs)
因为您指出可以有多个
endPointUrl
标记,所以我选择以下更自然的jQuery:
$('useCaseId', endPointDefs).filter(function(){
return $.text(this) == 'USER_LOGIN';
}).next();
从
支持的谓词
$("//input[@checked]")
$("//a[@ref='nofollow']")
$("//div[p]")
$("//div[p/a]")
事实上,我还有其他几个端点URL定义。所显示的只是XML结构的一个示例。它不起作用。我猜[]用于选择属性,而不是用于标记值。对于XPATH,对于属性,我们使用[@attr=value]语法。您确定吗?我这里有一个例子:(它
alert
s找到的元素数,是1。也许你应该使用$(endPointDefs)
,而不仅仅是endPointDefs
?这很有效$('endPointDef>useCaseId:contains('USER_LOGIN')+endPointUrl',endPointDefs),谢谢你的时间。我想我必须开始学习css选择器了。:)IE 7似乎有问题。上面的选择器在FF中工作,但在IE 7中不工作。这是1.1.2的API,非常非常过时。