Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XPATH表达式在JQuery中失败_Jquery_Xpath - Fatal编程技术网

XPATH表达式在JQuery中失败

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

我在尝试解析从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>
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();

支持的谓词

  • [@foo]具有foo属性

     $("//input[@checked]")
    
  • [@foo='test']属性foo等于test

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

     $("//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,非常非常过时。