2010-11-07 85 views
2

我使用jQuery解析一些xml和具有與下面的線路麻煩:JQuery的包含精確搜索

$(xml).find("ACT:contains(" + selectedAct + ")>SCENE").each(function() 

例如,如果所選擇的行爲是「ACT I」,那麼上述線認定不只有'ACT I',還有'ACT II','ACT IV'等,即它返回包含變量selectedAct的所有動作。

任何幫助,非常感謝。我看過一些例子,其中'過濾器'與匿名函數一起使用,但我不知道如何構建它與上面的代碼相關。

任何想法?

非常感謝

編輯:

XML示例:

<ACT><TITLE>ACT I</TITLE> 

<SCENE><TITLE>SCENE I. Alexandria. A room in CLEOPATRA's palace.</TITLE> 
<STAGEDIR>Enter DEMETRIUS and PHILO</STAGEDIR> 

<SPEECH> 
<SPEAKER>PHILO</SPEAKER> 
<LINE>Nay, but this dotage of our general's</LINE> 

DTD:

<!-- DTD for Shakespeare J. Bosak 1994.03.01, 1997.01.02 --> 
<!-- Revised for case sensitivity 1997.09.10 --> 
<!-- Revised for XML 1.0 conformity 1998.01.27 (thanks to Eve Maler) --> 

<!ENTITY amp "&#38;#38;"> 
<!ELEMENT PLAY  (TITLE, FM, PERSONAE, SCNDESCR, PLAYSUBT, INDUCT?, 
         PROLOGUE?, ACT+, EPILOGUE?)> 
<!ELEMENT TITLE (#PCDATA)> 
<!ELEMENT FM  (P+)> 
<!ELEMENT P  (#PCDATA)> 
<!ELEMENT PERSONAE (TITLE, (PERSONA | PGROUP)+)> 
<!ELEMENT PGROUP (PERSONA+, GRPDESCR)> 
<!ELEMENT PERSONA (#PCDATA)> 
<!ELEMENT GRPDESCR (#PCDATA)> 
<!ELEMENT SCNDESCR (#PCDATA)> 
<!ELEMENT PLAYSUBT (#PCDATA)> 
<!ELEMENT INDUCT (TITLE, SUBTITLE*, (SCENE+|(SPEECH|STAGEDIR|SUBHEAD)+))> 
<!ELEMENT ACT  (TITLE, SUBTITLE*, PROLOGUE?, SCENE+, EPILOGUE?)> 
<!ELEMENT SCENE (TITLE, SUBTITLE*, (SPEECH | STAGEDIR | SUBHEAD)+)> 
<!ELEMENT PROLOGUE (TITLE, SUBTITLE*, (STAGEDIR | SPEECH)+)> 
<!ELEMENT EPILOGUE (TITLE, SUBTITLE*, (STAGEDIR | SPEECH)+)> 
<!ELEMENT SPEECH (SPEAKER+, (LINE | STAGEDIR | SUBHEAD)+)> 
<!ELEMENT SPEAKER (#PCDATA)> 
<!ELEMENT LINE  (#PCDATA | STAGEDIR)*> 
<!ELEMENT STAGEDIR (#PCDATA)> 
<!ELEMENT SUBTITLE (#PCDATA)> 
<!ELEMENT SUBHEAD (#PCDATA)> 
+0

您能舉一個XML文檔的例子嗎? – user113716 2010-11-07 20:54:19

+0

你的XML是怎樣的? – Anurag 2010-11-07 20:55:07

回答

2

試試這個:

$(xml).find("ACT > TITLE").filter(function() { 
    return this.firstChild.nodeValue === selectedAct; 
}).siblings('SCENE').each(function() {... 
+0

完美地工作 - 謝謝帕特里克! – Rory 2010-11-07 23:42:14

+0

@Rory - 不客氣。 :O) – user113716 2010-11-08 02:13:05

2

你可以嘗試擴展選擇器...我在我的博客中做了demo

$.extend($.expr[':'],{ 
containsExact: function(a,i,m){ 
return $.trim(a.innerHTML.toLowerCase()) === m[3].toLowerCase(); 
}, 
containsExactCase: function(a,i,m){ 
return $.trim(a.innerHTML) === m[3]; 
}, 
containsRegex: function(a,i,m){ 
var regreg = /^\/((?:\\\/|[^\/])+)\/([mig]{0,3})$/, 
    reg = regreg.exec(m[3]); 
return RegExp(reg[1], reg[2]).test($.trim(a.innerHTML)); 
} 
});