1. ¿Qué es XPath
XPath (XML Path Language) es un lenguaje de rutas para XML. Su finalidad:
Mediante expresiones de ruta, consulta nodos, textos y atributos de nodo dentro de documentos XML/HTML, además soporta el filtrado por condiciones.
Punto importante: HtmlAgilityPack transforma documentos HTML en un DOM similar al XML, así que puedes usar XPath directamente para extraer contenido de páginas web.
2. Ejemplo de XML de referencia
<?xml version="1.0" encoding="utf-8"?>
<WebInfos>
<WebInfo>
<Name>FoxDevelop</Name>
<Domain>https://foxdevelop.com</Domain>
<IP type="ipv4">127.0.0.1</IP>
<Age>1</Age>
</WebInfo>
<WebInfo>
<Name>google</Name>
<Domain>https://www.google.com</Domain>
<IP type="ipv4">95.0.0.1</IP>
<Age>23</Age>
</WebInfo>
<WebInfo>
<Name>microsoft</Name>
<Domain>https://www.microsoft.com</Domain>
<IP type="ipv4">192.186.0.1</IP>
<Age>13</Age>
</WebInfo>
</WebInfos>Lenguaje del código: HTML, XML (xml)
3. Explicación detallada de la sintaxis XPath
Descripción de los símbolos básicos
| Símbolo | Significado |
|---|---|
/ | Inicia la búsqueda desde el nodo raíz; separador de niveles de jerarquía |
// | Busca en cualquier parte del documento, sin limitar los niveles |
[] | Condiciones de filtro e índices; los índices empiezan en 1 (no en 0) |
@ | Coincide con los atributos de las etiquetas |
Análisis caso por caso
/WebInfos
Obtiene el nodo de nivel superior<WebInfos>partiendo del nodo raíz/WebInfos/WebInfo[1]
Recupera el primer nodo<WebInfo>→ Datos de FoxDevelop
⚠️ Los índices de XPath comienzan en 1
/WebInfos/WebInfo[Age>5]
Filtra los nodos WebInfo cuyo nodo hijo<Age>tenga un valor numérico superior a 5
Resultados coincidentes: google (23), microsoft (13)/WebInfos/WebInfo[Age>5]/Name
Sobre el resultado del filtro anterior, extrae los nodos hijos<Name>/WebInfos/WebInfo[last()]
Funciónlast(): obtiene el último nodo WebInfo → microsoft/WebInfos/WebInfo[last()-1]
Obtiene el penúltimo nodo WebInfo → google/WebInfos/WebInfo[position()<3]position()devuelve el número de orden del nodo actual; coincide con órdenes menores que 3 → los dos primeros registros (FoxDevelop, google)//IP[@type='ipv4']//búsqueda global; filtra nodos<IP>cuyo atributotypesea igual aipv4//@type
Recupera todos los atributos denominadostypedel documento//WebInfo
Búsqueda global de todos los nodos<WebInfo>del documento, sin importar su nivel de anidamiento
4. Sintaxis útiles adicionales
//Name/text() # Obtener el texto interno de la etiqueta Name
//WebInfo[Name="FoxDevelop"] # Coincidir nodo según su contenido textual
//IP/@type # Leer el valor del atributo type de la etiqueta IPLenguaje del código: JSON / JSON con comentarios (json)
5. Uso dentro de HtmlAgilityPack
var doc = new HtmlDocument();
doc.Load("demo.xml");
// Selecciona los nombres de sitios con Age>5
var nodes = doc.DocumentNode.SelectNodes(@"/WebInfos/WebInfo[Age>5]/Name");
foreach(var node in nodes)
{
Console.WriteLine(node.InnerText);
}Lenguaje del código: PHP (php)
XPath
Previous: Introducción
Next: Aplicación práctica