2010-11-07 2 views
2

Я использую JQuery, чтобы разобрать некоторые XML и возникают проблемы с линией ниже:JQuery содержит точный поиск

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

Например, если выбран акт «ACT I», то выше линии находит не только «ACT I», но также «ACT II», «ACT IV» и т. д., то есть он возвращает все действия, содержащие переменную selectedAct.

Любая помощь очень ценится. Я видел примеры, где «фильтр» используется с анонимной функцией, но я не знаю, как его структурировать по отношению к моему коду выше.

Любые идеи?

Большое спасибо

EDIT:

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

+0

Как выглядит ваш XML? – Anurag

ответ

2

Попробуйте это:

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

Работает отлично - спасибо patrick! – Rory

+0

@Rory - Добро пожаловать. : О) – user113716

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)); 
} 
}); 
Смежные вопросы