2012-10-26 48 views
1

我對Jquery很新穎。我試圖做一個插件,從幾個頁面中檢索信息。 我做一個Ajax調用,並得到一個XML,然後我要選擇一個節點的具體文本,XMLC看起來是這樣的:如何返回一個xml節點並從其子節點獲取.text()?

<status> 
    <item> 
    <name>NameA</name> 
    <serviceUrl>theURL</serviceUrl> 
    <timeout>184</timeout> 
    <errorMessage></errorMessage> 
    <statusMessage>SpecificMessage</statusMessage> 
    </item> 
    <item> 
    <name>NameB</name> 
    <serviceUrl>theURL</serviceUrl> 
    <timeout>200</timeout> 
    <errorMessage></errorMessage> 
    <statusMessage>SpecificMessageB</statusMessage> 
    </item> 
    <item> 
    <name>NameC</name> 
    <serviceUrl>theURL</serviceUrl> 
    <timeout>300</timeout> 
    <errorMessage></errorMessage> 
    <statusMessage>SpecificMessageC</statusMessage> 
    </item> 
</status> 

和我的代碼,我不能做的工作是:

function parseXml(xml) 
{ 
    item = getItemFor(xml, "NameB"); 
    console.log("name: " + item.find("name").text()); 
    console.log("serviceUrl: " + item.find("serviceUrl").text()); 
    console.log("timeout: " + item.find("timeout").text()); 
} 

var getItemFor= function(xml, name){ 
    $(xml).find("item").each(function(){ 
     var itName = $(this).find("name").text(); 
     if (itName === name){ 
      console.log("Found: " + name); 
      return $(this); 
     } 


    }); 
} 

底線,我無法得到名稱nameB的getItemFor函數的xml項NODE,我也無法停止.each()循環。

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

對不起,請注意下次 – Pepepapa82

回答

1

一個解決方法是修改您getItemFor函數來傳遞從內環路返回的結果:

var getItemFor = function(xml, name) { 
    var result = null; 
    $(xml).find("item").each(function() { 
     var itName = $(this).find("name").text(); 
     if (itName === name) { 
      console.log("Found: " + name); 
      result = $(this); 
     } 
    }); 
    return result; 
} 

或完全簡化parseXml(減少到一個選擇器):

function parseXml(xml) { 

    var item = $('item name:contains("NameB")', xml).parent(); 

    console.log("name: " + item.find("name").text()); 
    console.log("serviceUrl: " + item.find("serviceUrl").text()); 
    console.log("timeout: " + item.find("timeout").text()); 
} 

見本FIDDLE

+0

我喜歡第二個選項。我也在尋找一種簡化的方式。謝謝!! – Pepepapa82

+0

請注意,第二個選項是尋找包含** NameB的名稱**,這意味着NameBCD也適合。請參閱此[回答](http://stackoverflow.com/a/5501271/944681)進行修復。 –