2012-01-20 28 views
5

Estoy intentando construir un motor de búsqueda simple usando HtmlAgilityPack y Xpath con C# (.NET 4). Quiero encontrar todos los nodos que contengan una palabra de búsqueda definida por el usuario, pero parece que no puedo obtener el XPath correcto. Por ejemplo:Uso de Xpath y HtmlAgilityPack para encontrar todos los elementos con texto inerte que contiene una palabra o palabras específicas

<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> 

Si la palabra de búsqueda especificada es "Sr. T" me gustaría que los nodos siguientes: <H1>, el segundo <div>, <H2> y la segunda <p>. He intentado numerosas variantes de doc.DocumentNode.SelectNodes("//text()[contains(., "+ searchword +")]"); pero siempre parezco terminar con cada nodo en todo el DOM.

Cualquier sugerencia para llevarme en la dirección correcta sería muy apreciada.

Respuesta

12

Uso:

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

Esto selecciona todos los elementos del documento XML que tienen un niño de texto-nodo que contiene la cadena 'Mr T'.

Esto también se puede escribir más corto como:

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

Esto selecciona el padre (s) de cualquier nodo de texto que contiene la cadena 'Mr T'.

+0

Su segunda expresión coincide exactamente con lo que el PO dice que intenté (excepto el '..') adicional, así que no estoy seguro de por qué cree que no funcionó. –

+0

@lwburk: "No funcionó, porque selecciona * nodos de texto * y necesita sus padres. –

+0

Correcto, entiendo eso, pero ciertamente no selecciona *" cada nodo en todo el DOM "* (como se dijo). –

-1

utilizar lo siguiente:

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

Esto selecciona todos los elementos (*) cuyo primer texto niño (text()[1]) contiene la searchword.

1

De acuerdo con XPath, si usted quiere encontrar una palabra clave específica que debe seguir el formato ("palabra clave" es el término que desea buscar):

// * [Texto() [contiene ]]

tienes que seguir el mismo formato que el anterior en C#, keyword es la variable de cadena se llama (, 'palabra clave'.): solución

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

Intente explicar su respuesta con más detalle. Esto no solo ayudará al OP, sino a cualquier otra persona en el futuro que pueda tener el mismo problema. –

0

Caso insensible:

var xpathForFindText = "// * [texto() [contiene (traducir (, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '". + LowerFocusKwd + "')]]";

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

Nota:

tener cuidado, porque el lowerFocusKwd no debe contener los siguientes caracteres, debido a que el XPath será de mala formato:

'

Cuestiones relacionadas