XPATH выражение не выполняется в JQuery - PullRequest
0 голосов
/ 07 января 2011

Я столкнулся с проблемой при попытке разобрать строку XML, возвращенную из Ajax Call.Структура 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');
          }  
   }
    );

Я попытался выполнить запрос XPATH с помощью JQuery следующим образом:

    $("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 голосов
/ 07 января 2011

jQuery использует не XPath, а CSS-подобные селекторы. Учитывая, что у вас есть только один элемент endPointUrl, я думаю, вы можете использовать следующий селектор:

$("endPointUrl",endPointDefs)

Поскольку вы указываете, что может быть более одного тега endPointUrl, я бы пошел на следующее, что более естественно для jQuery:

$('useCaseId', endPointDefs).filter(function(){
    return $.text(this) == 'USER_LOGIN';
}).next();
0 голосов
/ 07 января 2011

С http://docs.jquery.com/DOM/Traversing/Selectors#XPath_Selectors

Поддерживаемые предикаты

  1. [@ foo] Имеет атрибут foo

     $("//input[@checked]")
    
  2. [@ foo = 'test'] Атрибут foo равен test

     $("//a[@ref='nofollow']")
    
  3. [Nodelist] Элемент содержит список узлов, например:

     $("//div[p]")
     $("//div[p/a]")
    
0 голосов
/ 07 января 2011

Я думаю, что здесь происходит 2 вещи: во-первых, jQuery использует > в качестве селектора прямого потомка, поэтому вы должны использовать это вместо /. Во-вторых, вы используете endPointDefs xml в качестве контекста, что означает, что, когда jQuery начинает искать элементы, он уже находится «в» теге <endPointDefs>. В этом теге нет тегов <endPointDefs>, поэтому он не находит ни одного.

РЕДАКТИРОВАТЬ: также, чтобы проверить текст в теге, используйте селектор :contains().

РЕДАКТИРОВАТЬ 2: Ах, теперь я вижу endPointUrl рядом с useCaseId, а не внутри него.

Думаю, правильный селектор будет:

$("endPointDef>useCaseId:contains('USER_LOGIN')+endPointUrl",endPointDefs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...