Expresiones XPath compiladas
Un objeto XPathExpression representa una consulta XPath compilada devuelta desde el método Compile estático de la clase XPathExpression o desde el método Compile de la clase XPathNavigator.
La clase XPathExpression
Una consulta XPath compilada que está representada por un objeto XPathExpression es útil si esa misma consulta XPath se utiliza más de una vez.
Por ejemplo, al llamar varias veces al método Select, en lugar de utilizar una cadena que represente a la consulta XPath cada una de esas veces, utilice el método Compile de la clase XPathExpression o el método Compile de la clase XPathNavigator para compilar y almacenar en caché la consulta XPath en un objeto XPathExpression, para poder reutilizarla y mejorar el rendimiento.
Una vez compilado, el objeto XPathExpression se puede utilizar como entrada en los siguientes métodos de la clase XPathNavigator dependiendo del tipo devuelto desde la consulta XPath.
En la siguiente tabla se describe cada uno de los tipos de valores devueltos de XPath del W3C, sus equivalencias en Microsoft .NET Framework y con qué métodos se puede utilizar el objeto XPathExpression basándose en su tipo de valor devuelto.
Tipo de valor devuelto de XPath del W3C | Tipo equivalente en .NET Framework | Descripción | Métodos |
---|---|---|---|
Node set |
XPathNodeIterator | Una colección no ordenada de nodos sin duplicados creados en el orden del documento. | Select o Evaluate |
Boolean |
Boolean | Un valor true o false . |
Evaluate, o bien Matches |
Number |
Double | Número en punto flotante. | Evaluate |
String |
String | Una secuencia de caracteres UCS. | Evaluate |
Nota
El método Matches acepta una expresión XPath como parámetro. El método SelectSingleNode devuelve un objeto XPathNavigator, no uno de los tipos de valores devueltos de XPath del W3C.
La propiedad ReturnType
Una vez compilada una consulta XPath en un objeto XPathExpression, puede utilizar la propiedad ReturnType del objeto XPathExpression para determinar qué devuelve la consulta XPath.
La propiedad ReturnType devuelve uno de los siguientes valores de enumeración XPathResultType que representan los tipos de valores devueltos de XPath del W3C.
En el siguiente ejemplo se utiliza el objeto XPathExpression para devolver un número y un conjunto de nodos desde el archivo books.xml
. La propiedad ReturnType de cada objeto XPathExpression, así como los resultados de los métodos Evaluate y Select, se escriben en la consola.
Dim document As XPathDocument = New XPathDocument("books.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
' Returns a number.
Dim query1 As XPathExpression = navigator.Compile("bookstore/book/price/text()*10")
Console.WriteLine(query1.ReturnType)
Dim number As Double = CType(navigator.Evaluate(query1), Double)
Console.WriteLine(number)
' Returns a node set.
Dim query2 As XPathExpression = navigator.Compile("bookstore/book/price")
Console.WriteLine(query2.ReturnType)
Dim nodes As XPathNodeIterator = navigator.Select(query2)
nodes.MoveNext()
Console.WriteLine(nodes.Current.Value)
XPathDocument document = new XPathDocument("books.xml");
XPathNavigator navigator = document.CreateNavigator();
// Returns a number.
XPathExpression query1 = navigator.Compile("bookstore/book/price/text()*10");
Console.WriteLine(query1.ReturnType);
Double number = (Double)navigator.Evaluate(query1);
Console.WriteLine(number);
// Returns a node set.
XPathExpression query2 = navigator.Compile("bookstore/book/price");
Console.WriteLine(query2.ReturnType);
XPathNodeIterator nodes = navigator.Select(query2);
nodes.MoveNext();
Console.WriteLine(nodes.Current.Value);
En el ejemplo se toma como entrada el archivo books.xml
.
<?xml version="1.0" encoding="utf-8" ?>
<bookstore>
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
Expresiones XPath de mayor rendimiento
Para mejorar el rendimiento, utilice la expresión XPath lo más específica posible en las consultas. Por ejemplo, si el nodo book
es un nodo secundario del nodo bookstore
y el nodo bookstore
es el elemento superior de un documento XML, es más rápido utilizar la expresión XPath /bookstore/book
que //book
. La expresión XPath //book
examinará cada nodo del árbol XML para identificar nodos coincidentes.
Además, el uso de métodos de navegación por conjuntos de nodos que proporciona la clase XPathNavigator, puede producir una mejora del rendimiento con respecto a los métodos de selección que proporciona la clase XPathNavigator en los casos en los que los criterios de selección sean sencillos. Por ejemplo, si tiene que seleccionar el primer nodo secundario del nodo actual, es más rápido utilizar el método MoveToFirst que la expresión XPath child::*[1]
y el método Select.
Para obtener más información sobre los métodos de navegación por conjuntos de nodos de la clase XPathNavigator, vea Navegación por un conjunto de nodos con XPathNavigator.
Vea también
- XmlDocument
- XPathDocument
- XPathNavigator
- Procesamiento de datos XML con el modelo de datos XPath
- Seleccionar datos XML con XPathNavigator
- Evaluación de expresiones XPath con XPathNavigator
- Coincidencia de nodos con XPathNavigator
- Tipos de nodos reconocidos con consultas XPath
- Espacios de nombres y consultas XPath