2012-10-26 137 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)进行修复。 –