Compartir a través de


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