Compartir a través de


Espacios de nombres y consultas XPath

Las consultas XPath distinguen los espacios de nombres de un documento XML y pueden utilizar prefijos de espacio de nombres para calificar nombres de atributos y elementos. Al calificar los nombres de atributos y elementos con un prefijo de espacio de nombres, se limitan los nodos que devuelve la consulta XPath a únicamente aquellos nodos que pertenecen a un espacio de nombres específico.

Por ejemplo, si el prefijo books se asigna al espacio de nombres http://www.contoso.com/books, la siguiente consulta XPath /books:books/books:book solo selecciona los elementos book en el espacio de nombres http://www.contoso.com/books.

XmlNamespaceManager

Para utilizar espacios de nombres en una consulta XPath, se crea un objeto derivado de la interfaz IXmlNamespaceResolver como la clase XmlNamespaceManager con el prefijo e identificador URI de espacio de nombres para incluirlo en la consulta XPath.

El objeto XmlNamespaceManager se puede utilizar en la consulta en cada una de las siguientes formas.

A continuación se enumeran los métodos de la clase XPathNavigator que aceptan un objeto derivado de la interfaz IXmlNamespaceResolver como parámetro.

Espacio de nombres predeterminado

En el siguiente documento XML, se utiliza el espacio de nombres predeterminado con un prefijo vacío para declarar el espacio de nombres http://www.contoso.com/books.

<books xmlns="http://www.contoso.com/books">  
    <book>  
        <title>Title</title>  
        <author>Author Name</author>  
        <price>5.50</price>  
    </book>  
</books>  

XPath trata el prefijo vacío como el espacio de nombres null. Dicho de otro modo, en las consultas XPath solo se pueden utilizar prefijos asignados a espacios de nombres. Esto significa que si desea realizar una consulta en un espacio de nombres de un documento XML, aunque se trate del espacio de nombres predeterminado, tiene que definir un prefijo para él.

Por ejemplo, si no se define un prefijo para el documento XML anterior, la consulta XPath /books/book no devolvería ningún resultado.

Se debe utilizar un prefijo para evitar ambigüedades al consultar documentos que tienen algunos nodos que no están en un espacio de nombres y otros que están en un espacio de nombres predeterminado.

En el siguiente código se define un prefijo para el espacio de nombres predeterminado y se seleccionan todos los elementos book del espacio de nombres http://www.contoso.com/books.

Dim document As XPathDocument = New XPathDocument("books.xml")  
Dim navigator As XPathNavigator = document.CreateNavigator()  
Dim query As XPathExpression = navigator.Compile("/books:books/books:book")  
Dim manager As XmlNamespaceManager = New XmlNamespaceManager(navigator.NameTable)  
manager.AddNamespace("books", "http://www.contoso.com/books")  
query.SetContext(manager)  
Dim nodes As XPathNodeIterator = navigator.Select(query)  
XPathDocument document = new XPathDocument("books.xml");  
XPathNavigator navigator = document.CreateNavigator();  
XPathExpression query = navigator.Compile("/books:books/books:book");  
XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);  
manager.AddNamespace("books", "http://www.contoso.com/books");  
query.SetContext(manager);  
XPathNodeIterator nodes = navigator.Select(query);  

Vea también