2011-01-07 9 views
0

Ajax呼び出しから返されたXML文字列を解析しようとしたときに問題が発生しました。 XMLの構造は次のとおりです。XPath式がJQueryで失敗する

<?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 

を私はjavascriptの変数にAJAX呼び出しからの応答を保存:

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

ここでは2つのことが起こっていると思います。まず、jQueryは>をダイレクトチャイルドセレクタとして使用するので、/の代わりにこれを使用してください。次に、endPointDefs xmlをコンテキストとして使用しています。つまり、jQueryが要素の検索を開始すると、既に<endPointDefs>タグ内にあることを意味します。このタグには<endPointDefs>タグがないため、何も見つかりません。

EDIT:また、タグ内のテキストをチェックするには、:contains()セレクタを使用します。

編集2:ああ、今はendPointUrluseCaseIdの横にあり、その中には表示されていません。

正しいセレクタ、私が思うに、次のようになります。

$("endPointDef>useCaseId:contains('USER_LOGIN')+endPointUrl",endPointDefs) 
+0

号は、それが動作しません。私は[]タグの値ではなく、属性を選択するためだと思います。 XPATHの場合、属性として[@ attr = value]構文を使用します。 – Sriraman

+0

本当ですか?私はここに例を示します:http://jsfiddle.net/cGuLg/(見つかった要素の数を1にして '警告します'おそらく 'endPointDefs'の代わりに' $(endPointDefs) 'を使うべきでしょうか? –

+0

これは$( "endPointDef> useCaseId:contains( 'USER_LOGIN')+ endPointUrl"、endPointDefs) あなたの時間のおかげで、私はCSSセレクタを習得しなければならないと思います:) – Sriraman

0

jQueryのは、XPathを使用していますが、CSSのようなセレクタはありません。あなたは一つだけendPointUrlの要素を持っていることを考えると、私はあなたが次のセレクタを使用することができ思うだろう:

$("endPointUrl",endPointDefs) 

複数のendPointUrlタグがあり得ることを示しているので、私は次のために行くだろう、

$('useCaseId', endPointDefs).filter(function(){ 
    return $.text(this) == 'USER_LOGIN'; 
}).next(); 
+0

実際、私は他のendPointUrl定義をいくつか持っています。示されているのは、XML構造の単なるサンプルです。 – Sriraman

+0

@Sriraman更新された回答を参照してください。 – lonesomeday

0

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

スッポから:これは、より自然なjQueryのですRTED述語は

  1. は[@foo]

    $("//a[@ref='nofollow']") 
    
  2. をテストするための

    $("//input[@checked]") 
    
  3. [@ FOO = 'テスト']属性fooは同じであるFOOの属性を持っています

  4. [Nodelist]要素にはノードリストが含まれていますが、exa mple:

    $("//div[p]") 
    $("//div[p/a]") 
    
+0

これは1.1.2用のAPIであり、非常に古くなっています。 [ここに現在のAPIはあります](http://api.jquery.com/category/selectors/)。 – lonesomeday

関連する問題