XPATH表达式在JQuery中失败

时间:2011-01-07 12:41:52

标签: jquery xpath

我在尝试解析从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查询?如果是这样,有人可以告诉我哪里出错了吗?

3 个答案:

答案 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

  

支持的谓词

     
      
  1. [@ foo] 属性为foo

     $("//input[@checked]")
    
  2.   
  3. [@ foo ='test'] 属性foo等于测试

     $("//a[@ref='nofollow']")
    
  4.   
  5. [Nodelist] 元素包含节点列表,例如:

     $("//div[p]")
     $("//div[p/a]")
    
  6.