Cómo utilizar XPath para seleccionar nodos XML – C#
XPath (XML Path Language) se basa en una representación DOM de un documento XML. Por lo tanto, puede utilizar XPath para buscar un nodo o nodos específicos en un archivo XML que coincidan con algunos criterios definidos en la expresión XPath. El artículo considera С# ejemplos de selección de la información requerida de un archivo XML mediante consultas XPath. Aprenderá a navegar a través de un documento XML y seleccionar nodos usando XPath.
Para aprender a utilizar el método Evaluate() para navegar por un documento HTML y seleccionar nodos mediante una consulta XPath, consulte el artículo Cómo utilizar el método XPath – Evaluate().
Puede descargar los archivos de datos y ejemplos completos de C# que demuestran el uso del método Evaluate() para consultas XPath desde GitHub.
Consulta XPath (XPath Query): seleccione nodos del archivo XML
Estos ejemplos mostrarán cómo seleccionar la información requerida de un archivo XML utilizando el lenguaje de consulta XPath. Echemos un vistazo al documento XML cars.xml. Este documento XML de prueba contiene una base de datos de concesionarios de automóviles, sus números de teléfono, nombres y una lista de los automóviles que poseen.
Compongamos secuencialmente expresiones XPath que seleccionarán nombres, números de teléfono y una lista de automóviles que le interesen. XPath es poderoso, como verá en los siguientes ejemplos:
Seleccione todos los nodos “Dealer” en el archivo XML
XPath se utiliza mediante programación para evaluar expresiones y seleccionar nodos específicos en un documento XML. Para seleccionar nodos de XML, utilice el método Evaluate().
Comencemos con una consulta XPath sencilla para todos los nodos “Dealer” en el documento XML. A continuación se utiliza la expresión XPath //Dealer
. Selecciona todos los elementos “Dealer” sin importar dónde se encuentren en el documento:
C# code
1var dealers = doc.Evaluate("//Dealer", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var dealers = document.evaluate("//Dealer", document, null, XPathResult.ANY_TYPE, null);
Por lo tanto, selecciona información sobre todos los distribuidores del archivo XML sin restricciones. La expresión XPath //Dealer
le permite seleccionar todos los nodos anidados llamados “Dealer”.
Seleccione nodos usando ejes XPath – descendant::
Consulta XPath con límites en la fecha de producción del automóvil
Compliquemos la consulta XPath y agreguemos una restricción al año de producción del automóvil.
Puede utilizar XPath Axes en expresiones XPath. XPath Axes representa una relación con el nodo actual y se utiliza para ubicar nodos relativos a ese nodo en el árbol del documento. El eje “descendiente” indica todos los hijos del nodo de contexto, todos sus hijos, etc. En otras palabras, el descendiente selecciona a todos los descendientes (hijos, nietos, etc.) del nodo actual. Por ejemplo, descendant::Car
selecciona todos los descendientes de Car del nodo actual.
Entonces, creemos una expresión XPath para encontrar los concesionarios que tienen un automóvil descendant::Car
con una fecha de fabricación del modelo posterior a 2005 descendant::Model > 2005
. En términos del árbol DOM, estamos buscando todos los hijos del “Dealer” llamados “Coche” que tengan un hijo llamado “Model” que tenga un valor mayor que “2005”. A continuación se utiliza la expresión XPath //Dealer[descendant::Car[descendant::Model > 2005]]
.
C# code
1var dealers = doc.Evaluate("//Dealer[descendant::Car[descendant::Model > 2005]]", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var dealers = document.evaluate("//Dealer[descendant::Car[descendant::Model > 2005]]", document, null, XPathResult.ANY_TYPE, null);
Consulta XPath con límites en la fecha y el precio de producción del automóvil
En el siguiente paso agreguemos más restricciones: introduzcamos una restricción en el precio del automóvil and descendant::Price < 25000
.
La expresión XPath sigue a //Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]
. Nota: las condiciones de precio y año de fabricación se combinan con y
, lo que significa que ambas condiciones se cumplen al mismo tiempo:
C# code
1var dealers = doc.Evaluate("//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var dealers = document.evaluate("//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]", document, null, XPathResult.ANY_TYPE, null);
Como resultado, sólo se seleccionarán concesionarios si tienen un automóvil con una fecha de fabricación no anterior a 2005 y un precio inferior a 25.000.
Ejemplo de C#, parte 1: seleccionar nodos del archivo XML
Consideremos cómo seleccionar distribuidores de un archivo XML que tengan un automóvil con una fecha de fabricación no anterior a 2005 y un precio inferior a 25.000 e imprimamos la información requerida en la consola. Debes seguir algunos pasos:
- Cargue un archivo XML existente ( cars.xml).
- Utilice el método
Evaluate() de la clase
Document y pase la expresión XPath
//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]
y otros parámetros. - Repita los nodos resultantes e imprima su contenido en la consola.
- Obtendrá una lista de distribuidores con todo el contenido de los nodos “Dealer”.
1// Create an instance of a document
2using (var doc = new HTMLDocument(Path.Combine(DataDir, "cars.xml")))
3{
4 // Select dealers that match XPath expression
5 var dealers = doc.Evaluate("//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
6 Node dealer;
7
8 // Iterate over the selected dealers
9 while ((dealer = dealers.IterateNext()) != null)
10 {
11 Console.WriteLine(dealer.TextContent);
12 }
13}
Ejemplo de C#, parte 2: seleccionar información específica de los nodos seleccionados
En la parte anterior del ejemplo, la consulta XPath selecciona todo el contenido del nodo “Dealer” que coincide con la expresión XPath //Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]
. Pero puedes elegir e imprimir sólo la información que te interese de todo el contenido del “Dealer” seleccionado.
En este ejemplo (
cars.xml), se agregó una consulta interna dentro del bucle a los nodos “Dealer” seleccionados. La consulta recopila como una cadena la información sobre el distribuidor, como “Name” y “Telephone”: concat('Dealer name: ', Name, 'Telephone: ', Telephone)"
. Preste atención al segundo parámetro pasado al método
Evaluate(expression
, contextNode
, resolver
, type
, result
) Este es el nodo relativo al cual se ejecutará la consulta: el actual nodo “Dealer”. Esta consulta concatena contenido de nodos con los nombres “Name” y “Telephone”. Nota: la consulta utiliza el tipo de resultado esperado de la cadena XPathResultType.String
y se obtiene el valor del resultado. a través de la propiedad StringValue
y no a través del iterador del nodo.
A la lista de concesionarios seleccionados, puede agregar el atributo “CarID”, que apunta a un automóvil específico. Se debe realizar una consulta con la expresión XPath .//Car[descendant::Model > 2005 and descendant::Price < 25000]/@CarID
. Hay varias funciones en la consulta agregada; veámoslos:
- la consulta selecciona todos los coches anidados en relación con el nodo actual
.//Car
, no en relación con la raíz del árbol//Car
; - en la expresión XPath, solicitamos el atributo
/@CarID
que nos interesa para los automóviles seleccionados.
1// Create an instance of a document
2using (var doc = new HTMLDocument(Path.Combine(DataDir, "cars.xml")))
3{
4 // Select dealers that match XPath expression
5 var dealers = doc.Evaluate("//Dealer[descendant::Car[descendant::Model > 2005 and descendant::Price < 25000]]", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
6 Node dealer;
7
8 // Iterate over the selected dealers
9 while ((dealer = dealers.IterateNext()) != null)
10 {
11 // Get and print Dealer name and Telephone
12 var dealerInfo = doc.Evaluate("concat('Dealer name: ', Name/text(), ' Telephone: ', Telephone/text())", dealer, doc.CreateNSResolver(doc), XPathResultType.String, null);
13 Console.WriteLine(dealerInfo.StringValue);
14
15 // Select and print CarID that match XPath expression
16 var carIds = doc.Evaluate(".//Car[descendant::Model > 2005 and descendant::Price < 25000]/@CarID", dealer, doc.CreateNSResolver(doc), XPathResultType.Any, null);
17 Node carId;
18
19 while ((carId = carIds.IterateNext()) != null)
20 {
21 Console.WriteLine("Car id: " + carId.TextContent);
22 }
23 }
24}
Como resultado obtenemos un listado de concesionarios con Nombres, Teléfonos y códigos ID de los coches que nos interesan.
Aspose.HTML ofrece Aplicaciones web HTML gratuitas que son una colección en línea de convertidores, fusiones, herramientas de SEO, generadores de código HTML, herramientas de URL y más. Las aplicaciones funcionan en cualquier sistema operativo con un navegador web y no requieren ninguna instalación de software adicional. Es una manera rápida y fácil de resolver de manera eficiente y efectiva sus tareas relacionadas con HTML.