2012-01-20 8 views
5

Próbuję zbudować prostą wyszukiwarkę przy użyciu HtmlAgilityPack i Xpath z C# (.NET 4). Chcę znaleźć każdy węzeł zawierający słowo wyszukiwania zdefiniowane przez użytkownika, ale nie mogę uzyskać poprawności XPath. Dla przykładu:Używanie Xpath i HtmlAgilityPack do znajdowania wszystkich elementów z innertextem zawierającym określone słowo lub słowa

<HTML> 
<BODY> 
    <H1>Mr T for president</H1> 
    <div>We believe the new president should be</div> 
    <div>the awsome Mr T</div> 
    <div> 
    <H2>Mr T replies:</H2> 
    <p>I pity the fool who doesn't vote</p> 
    <p>for Mr T</p> 
    </div> 
    </BODY> 
</HTML> 

Jeśli określony Searchword jest "Mr T" chciałbym następujące węzły: <H1>, drugi <div>, <H2> a drugi <p>. Próbowałem wielu wariantów doc.DocumentNode.SelectNodes("//text()[contains(., "+ searchword +")]");, ale zawsze wydaje mi się, że skończyć z każdym węzłem w całym DOM.

Wszelkie sugestie, jak dotrzeć we właściwym kierunku, będą bardzo cenne.

Odpowiedz

12

Zastosowanie:

//*[text()[contains(., 'Mr T')]] 

Wybiera wszystkie elementy w dokumencie XML, które mają dziecko text-węzła, który zawiera ciąg 'Mr T'.

To również może być napisany krótsze:

//text()[contains(., 'Mr T')]/.. 

to wybranie rodzica (ów) z dowolnego węzła tekstowego zawierającego ciąg 'Mr T'.

+0

Twój drugi wyrażenie pasuje dokładnie to, co PO mówi on próbował (z wyjątkiem dodatkowego '..'), więc nie jestem pewien, dlaczego on uważa, że ​​to nie działa. –

+0

@lwburk: To "nie działało, ponieważ wybiera * węzły tekstowe * i potrzebuje swoich rodziców –

+0

Dobrze, rozumiem, ale z pewnością nie wybiera *" każdego węzła w całym DOM "* (jak twierdził) –

-1

użyć następujących:

doc.DocumentNode.SelectNodes("//*[contains(text()[1], " + searchword + ")]") 

ten wybiera wszystkie elementy (*), których pierwszy tekst z dzieckiem (text()[1]) zawiera searchword.

1

Według XPath, jeśli chcesz znaleźć konkretne słowo kluczowe, które należy wykonać format ("słowo kluczowe" to słowo chcesz szukać):

// * [text() [zawiera ]]

trzeba śledzić ten sam format jak wyżej w C#, keyword jest zmienna ciąg zadzwonić ('Hasło'.): rozwiązanie

doc.DocumentNode.SelectNodes("//*[text()[contains(., '" + keyword + "')]]"); 
+0

Spróbuj wyjaśnić swoją odpowiedź bardziej szczegółowo. Pomoże to nie tylko OP, ale każdemu innemu, który może mieć ten sam problem. –

0

Case-niewrażliwy:

var xpathForFindText = "// * [tekst() [zawiera (tłumaczyć (, '', 'abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz')." + LowerFocusKwd + "')]]";

var result = doc.DocumentNode.SelectNodes (xpathForFindText);

Uwaga:

Bądź ostrożny, ponieważ lowerFocusKwd nie musi zawierać następujące charakter, ponieważ XPath będzie w złym formacie:

'

Powiązane problemy